Query SQL per trovare record dove conta> 1

Ho una tabella chiamata PAYMENT . All’interno di questa tabella ho un ID utente, un numero di conto, un codice di avviamento postale e una data. Vorrei trovare tutti i record per tutti gli utenti che hanno più di un pagamento al giorno con lo stesso numero di conto.

AGGIORNAMENTO: Inoltre, ci dovrebbe essere un filtro che conta solo i record il cui codice di avviamento postale è diverso.

Ecco come appare la tabella:

  |  user_id |  account_no |  zip |  data |
 |  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 |

Il risultato dovrebbe essere simile a questo:

  |  user_id |  contare |
 |  1 |  2 |

Come lo esprimeresti in una query SQL? Stavo pensando di iscrivermi, ma per qualche motivo il mio conteggio è sbagliato.

Utilizzare la clausola HAVING e GROUP per i campi che rendono la riga univoca

Il sotto troverà

tutti gli utenti che hanno più di un pagamento al giorno con lo stesso numero di conto

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

Aggiornamento Se si desidera includere solo quelli che hanno un ZIP distinto, è ansible ottenere prima un set distinto e quindi eseguire HAVING / GROUP BY

  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 

Prova questa query:

 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; 

Non consiglierei la parola chiave HAVING per i principianti, è essenzialmente per scopi legacy .

Non sono chiaro su quale sia la chiave per questo tavolo (è completamente normalizzato , mi chiedo?), Di conseguenza trovo difficile seguire le tue specifiche:

Vorrei trovare tutti i record per tutti gli utenti che hanno più di un pagamento al giorno con lo stesso numero di conto … Inoltre, ci dovrebbe essere un filtro che conta solo i record il cui codice di avviamento postale è diverso.

Quindi ho preso un’interpretazione letterale.

Quanto segue è più verboso, ma potrebbe essere più facile da capire e quindi mantenere (ho usato un CTE per la tabella PAYMENT_TALLIES ma potrebbe essere una VIEW :

 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)