Je suis assez nouveau dans SQL et mySQL, je suis autodidacte et j'essaie d'écrire une requête qui me montre toutes les lignes qui ont un nombre de 3 ou moins d'un ID correspondant dans la colonne ID.
Par exemple:
select concat(t1.id) as 'ID', t1.timestamp as 'timestamp', count(t1.id) as 'Number' from table1 t1 where -- Curly braces are Metabase variables t1.timestamp between {{startdate}} and {{enddate}} group by t1.id having count(*) < 3 order by id limit 1000
Idéalement, le résultat afficherait:
Id timestamp Number -- --------- --- 1 0001-12-01 1001 1 0001-12-01 1002 1 0001-12-02 3520 3 0001-12-01 1009 3 0001-12-01 1010 3 0001-12-01 1107
Cela reconnaît que les deux ID " 1 "et ID" 3 "ont 3 identifiants correspondants / comptés ou moins et affichent les résultats selon le filtre que j'ai mis en place.
J'ai réussi à écrire une requête qui compte les lignes et n'affiche que les nombres de 3 ou moins, mais cela les regroupe par leur ID et n'affiche pas les lignes. Cela ressemble à ceci:
Id timestamp Number -- --------- --- 1 0001-12-01 1001 1 0001-12-02 3520 1 0001-12-01 1002 2 0001-12-02 2152 2 0001-12-01 1005 2 0001-12-02 1250 2 0001-12-01 1007 2 0001-12-02 1536 3 0001-12-01 1009 2 0001-12-02 1305 3 0001-12-01 1010 2 0001-12-02 1125 3 0001-12-01 1107 2 0001-12-02 1108
J'ai fait quelques recherches autour de SO et d'autres ressources, mais je suis resté sec et j'espérais que quelqu'un pourrait me donner un coup de main ou une poussée dans la bonne direction. Toute aide est appréciée.
3 Réponses :
Vous devez joindre la table d'origine avec les ID trouvés dans une requête groupée.
SELECT table1.* FROM table1 JOIN ( SELECT id FROM table1 HAVING COUNT(*) <= 3 GROUP BY id ) AS grouped ON table1.id = grouped.id
En outre, vous devez utiliser plutôt que
.
Vous pouvez utiliser une jointure avec le groupe de sous-requête count (*) par l'ID
select * from table1 t1 inner join ( select id from table1 group by id having count(*) <= 3 ) t on t.id = t1.id
SELECT t1.* FROM YourTable t1 WHERE id IN ( SELECT t2.id FROM YourTable t2 WHERE t2.timestamp between {{startdate}} and {{enddate}} GROUP BY t2.id HAVING COUNT(*) <= 3) AND t1.timestamp between {{startdate}} and {{enddate}} ORDER BY t1.id
Quelle version de mysql utilisez-vous?
Si votre version MySQL ne prend pas encore en charge CTE, vous pouvez mettre l'agrégation (comptage) dans une sous-requête corrélée.