Zapytanie SQL do znajdowania rekordów gdzie count> 1

Mam tabelę o nazwie PAYMENT. W tej tabeli mam identyfikator użytkownika, numer konta, kod pocztowy i datę. Chciałbym znaleźć wszystkie rekordy dla wszystkich użytkowników, którzy mają więcej niż jedną płatność dziennie z tym samym numerem konta.

UPDATE: dodatkowo powinien być filtr, a nie tylko zlicza rekordy, których kod pocztowy jest inny.

Tak wygląda Tabela:

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

Wynik powinien wyglądać podobnie do tego:

| user_id | count |
|       1 |     2 |

Jak byś wyrazić to w zapytaniu SQL? Myślałem, że się przyłączysz, ale z jakiegoś powodu mój licznik jest zły.

Author: Benjamin Muschko, 2011-08-22

5 answers

Użyj klauzuli o klauzuli i grupuj według pól, które czynią wiersz unikalnym

Poniżej znajdziesz

Wszyscy użytkownicy, którzy mają więcej niż jedną płatność dziennie z tym samym numerem konta

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

Update Jeśli chcesz dołączyć tylko te, które mają oddzielny ZIP, możesz najpierw uzyskać oddzielny zestaw, a następnie wykonać / GROUP przez

 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
 225
Author: Conrad Frix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 18:52:35

Spróbuj tego zapytania:

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;
 26
Author: user4019456,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-08 14:11:40
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;
 2
Author: iryndin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 09:43:52

Nie polecałbym słowa kluczowego HAVING dla początkujących, jest to zasadniczo dla celów starszych .

Nie jestem pewien, co jest kluczem do tej tabeli (czy jest onaw pełni znormalizowana , zastanawiam się?), w związku z tym trudno jest mi przestrzegać Twojej specyfikacji:

Chciałbym znaleźć wszystkie rekordy dla wszystkich użytkowników, którzy mają więcej niż jeden płatność za dzień z tym samym numerem konta... Dodatkowo istnieje powinien być filtrem, a nie tylko zlicza rekordy, których Kod pocztowy jest inaczej.

Więc przyjęłam dosłowną interpretację.

Poniższe jest bardziej wyraziste, ale może być łatwiejsze do zrozumienia i dlatego utrzymania (użyłem CTE dla Tabeli PAYMENT_TALLIES ale może to być 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
              );
 0
Author: onedaywhen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 08:51:13
 delete t1 from @tbl t1  where 1<(select count(ID) from @tbl where ID=t1.ID)
 0
Author: Serdar KUŞ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 11:17:40