복붙노트

[SQL] 기록 횟수> (1)를 찾기위한 SQL 쿼리

SQL

기록 횟수> (1)를 찾기위한 SQL 쿼리

나는 테이블라는 이름의 지불이있다. 이 테이블 내에서 I는 사용자 ID, 계좌 번호, 우편 번호 및 날짜가 있습니다. 나는 같은 계좌 번호와 하루에 하나 개 이상의 지불이있는 모든 사용자에 대한 모든 기록을 찾을 싶습니다.

업데이트 : 단지 누구의 우편 번호는 다른 레코드를 계산보다 또한, 필터가 있어야한다.

테이블처럼 보이는 방법이다 :

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

결과는 다음과 유사합니다 :

| user_id | count |
|       1 |     2 |

당신은 어떻게 SQL 쿼리에이 표현할 것인가? 나는 자기가 가입 생각하지만 어떤 이유로 내 계산이 잘못되었습니다.

해결법

  1. ==============================

    1.행이 고유하게 만들기 필드에 의해 HAVING 절과 GROUP을 사용하여

    행이 고유하게 만들기 필드에 의해 HAVING 절과 GROUP을 사용하여

    아래 찾을 것입니다

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

    최신 정보 당신은 단지 별개의 우편 번호를 가지고 그 사람들을 포함하려면 먼저 별개의 세트를 가져온 다음 / GROUP BY를 HAVING을 수행 할 수 있습니다

     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
    
  2. ==============================

    2.이 쿼리 검색 :

    이 쿼리 검색 :

    SELECT column_name
      FROM table_name
     GROUP BY column_name
    HAVING COUNT(column_name) = 1;
    
  3. ==============================

    3.나는 그것은 기존의 목적을 위해 본질적으로, 초보자를위한 HAVING 키워드를 추천하지 않을 것입니다.

    나는 그것은 기존의 목적을 위해 본질적으로, 초보자를위한 HAVING 키워드를 추천하지 않을 것입니다.

    나는 (내가 궁금해, 완전히 정규화?)이 테이블의 핵심이 무엇인지에 명확하지 않다, 결과적으로 나는 어려운 당신의 사양을 참조 할 수 :

    그래서 나는 문자 그대로의 해석을 촬영했습니다.

    다음은 더 자세한하지만 이해 때문에 나는 테이블 PAYMENT_TALLIES에 대한 CTE를 사용했습니다 (유지하지만, 그것은 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
                  );
    
  4. ==============================

    4.

    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;
    
  5. from https://stackoverflow.com/questions/7151401/sql-query-for-finding-records-where-count-1 by cc-by-sa and MIT license