Requête SQL pour trouver des enregistrements où compter> 1

J’ai une table nommée PAYMENT . Dans ce tableau, j’ai un identifiant d’utilisateur, un numéro de compte, un code postal et une date. J’aimerais trouver tous les enregistrements pour tous les utilisateurs qui ont plus d’un paiement par jour avec le même numéro de compte.

MISE À JOUR: De plus, il doit y avoir un filtre qui ne compte que les enregistrements dont le code postal est différent.

Voici à quoi ressemble la table:

  |  user_id |  account_no |  zip |  date |
 |  1 |  123 |  55555 |  12-DEC-09 | 
 |  1 |  123 |  66666 |  12-DEC-09 |
 |  1 |  123 |  55555 |  13-DEC-09 |
 |  2 |  456 |  77777 |  14-DEC-09 |
 |  2 |  456 |  77777 |  14-DEC-09 |
 |  2 |  789 |  77777 |  14-DEC-09 |
 |  2 |  789 |  77777 |  14-DEC-09 |

Le résultat devrait ressembler à ceci:

  |  user_id |  compter |
 |  1 |  2 |

Comment exprimeriez-vous cela dans une requête SQL? Je pensais me joindre à moi-même mais pour une raison quelconque, mon compte est erroné.

    Utilisez la clause HAVING et les champs GROUP By pour rendre la ligne unique

    Le ci-dessous trouvera

    tous les utilisateurs qui ont plus d’un paiement par jour avec le même numéro de compte

     SELECT user_id , COUNT(*) count FROM PAYMENT GROUP BY account, user_id , date Having COUNT(*) > 1 

    Mise à jour Si vous souhaitez inclure uniquement ceux qui ont un ZIP distinct, vous pouvez d’abord obtenir un ensemble distinct, puis vous exécuter.

      SELECT user_id, account_no , date, COUNT(*) FROM (SELECT DISTINCT user_id, account_no , zip, date FROM payment ) payment GROUP BY user_id, account_no , date HAVING COUNT(*) > 1 

    Essayez cette requête:

     SELECT column_name FROM table_name GROUP BY column_name HAVING COUNT(column_name) = 1; 
     create table payment( user_id int(11), account int(11) not null, zip int(11) not null, dt date not null ); insert into payment values (1,123,55555,'2009-12-12'), (1,123,66666,'2009-12-12'), (1,123,77777,'2009-12-13'), (2,456,77777,'2009-12-14'), (2,456,77777,'2009-12-14'), (2,789,77777,'2009-12-14'), (2,789,77777,'2009-12-14'); select foo.user_id, foo.cnt from (select user_id,count(account) as cnt, dt from payment group by account, dt) foo where foo.cnt > 1; 

    Je ne recommanderais pas le mot-clé HAVING pour les débutants, c’est essentiellement à des fins héritées .

    Je ne suis pas clair sur ce qui est la clé pour cette table (est-ce complètement normalisé , je me le demande?), Par conséquent je trouve difficile de suivre vos spécifications:

    Je voudrais trouver tous les enregistrements pour tous les utilisateurs qui ont plus d’un paiement par jour avec le même numéro de compte … En outre, il devrait y avoir un filtre qui ne compte que les enregistrements dont le code postal est différent.

    J’ai donc pris une interprétation littérale.

    Ce qui suit est plus verbeux mais pourrait être plus facile à comprendre et donc à maintenir (j’ai utilisé un CTE pour la table PAYMENT_TALLIES mais cela pourrait être une vue:

     WITH PAYMENT_TALLIES (user_id, zip, tally) AS ( SELECT user_id, zip, COUNT(*) AS tally FROM PAYMENT GROUP BY user_id, zip ) SELECT DISTINCT * FROM PAYMENT AS P WHERE EXISTS ( SELECT * FROM PAYMENT_TALLIES AS PT WHERE P.user_id = PT.user_id AND PT.tally > 1 ); 
      delete t1 from @tbl t1 where 1<(select count(ID) from @tbl where ID=t1.ID)