programing

레코드를 검색하기 위한 SQL 쿼리(count > 1 )

powerit 2023. 4. 13. 21:12
반응형

레코드를 검색하기 위한 SQL 쿼리(count > 1 )

제 테이블에는PAYMENT이 테이블에는 사용자 ID, 계정 번호, 우편 번호 및 날짜가 있습니다.동일한 계좌번호로 하루에 두 번 이상 결제한 모든 사용자의 기록을 찾고 싶습니다.

업데이트: 또한 ZIP 코드가 다른 레코드만 카운트하는 필터가 있어야 합니다.

표는 다음과 같습니다.

| user_id | account_no | zip | date || 1 | 123 | 55555 | 09년 12월 12일 || 1 | 123 | 66666 | 2009년 12월 12일 || 1 | 123 | 55555 | 09년 12월 13일 || 2 | 456 | 7777 | 09년 12월 14일 || 2 | 456 | 7777 | 09년 12월 14일 || 2 | 789 | 7777 | 09년 12월 14일 || 2 | 789 | 7777 | 09년 12월 14일 |

결과는 다음과 같습니다.

| user_id | 카운트 ||       1 |     2 |

SQL 쿼리에서 이를 어떻게 표현하시겠습니까?나는 셀프 가입을 생각하고 있었는데 왠지 내 카운트가 틀렸다.

을 고유하게 만드는 HAVING 절과 GROUP By 필드를 사용합니다.

이하를 참조해 주세요.

동일한 계정 번호로 하루에 두 개 이상의 결제가 있는 모든 사용자

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

업데이트 개별 ZIP만 포함하려면 먼저 개별 세트를 얻은 후 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

다음 쿼리를 사용해 보십시오.

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

추천하지 않습니다.HAVING키워드는 기본적으로 레거시 목적으로 사용됩니다.

이 표의 키가 무엇인지 확실하지 않기 때문에(완전히 정규화되어 있는지 궁금하네요), 따라서 귀사의 사양을 따르기가 어렵습니다.

동일한 계정 번호로 하루에 두 번 이상 결제한 모든 사용자의 기록을 찾고 싶습니다.또한 ZIP 코드가 다른 레코드만 카운트하는 필터가 있어야 합니다.

그래서 문자 그대로 해석해봤습니다.

다음은 좀 더 상세하지만 이해하기 쉽고 유지보수가 용이할 수 있습니다(테이블에 CTE를 사용했습니다).PAYMENT_TALLIES단, 다음과 같은 경우가 있습니다.

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

언급URL : https://stackoverflow.com/questions/7151401/sql-query-for-finding-records-where-count-1

반응형