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.