1
votes

Essayer d'afficher les lignes correspondantes qui correspondent à un ID compté 3 fois ou moins. Table simple

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.


2 commentaires

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.


3 Réponses :


1
votes

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 .


0 commentaires

0
votes

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 


0 commentaires

1
votes
 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

0 commentaires