用于查找count> 1的记录的SQL查询

Ben*_*hko 161 sql group-by count having

我有一张名为的桌子PAYMENT.在此表中,我有一个用户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查询中表达这一点?我在想自己加入,但由于某种原因,我的计数是错误的.

Con*_*rix 316

使用HAVING子句和GROUP By使行唯一的字段

以下将找到

所有使用相同帐号每天付款多次的用户

SELECT 
 user_id ,
 COUNT(*) count
FROM 
 PAYMENT
GROUP BY
 account,
 user_id ,
 date
Having
COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

更新 如果您只想包含具有不同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
Run Code Online (Sandbox Code Playgroud)


小智 38

试试这个查询:

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;
Run Code Online (Sandbox Code Playgroud)

  • 整洁,但这并不能回答问题 (4认同)

one*_*hen 6

我不会HAVING向新手推荐该关键字,它本质上是为了遗留目的

我不清楚这个表的关键是什么(我想知道它是否完全标准化?),因此我发现很难遵循您的规范:

我想查找每天使用相同帐号进行多次付款的所有用户的所有记录...此外,应该有一个过滤器,而不是只计算邮政编码不同的记录。

所以我采取了字面解释。

下面的内容更详细,但更容易理解,因此也更容易维护(我在表中使用了CTEPAYMENT_TALLIES,但它可能是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
              );
Run Code Online (Sandbox Code Playgroud)

  • 当可读性/可维护性是主要关注点时,CTE/子查询方法绝对值得使用。不过,我不同意“HAVING”是“遗产”——十年后它仍然被广泛使用,并且是一个非常有用的速记,可以避免示例中的冗长内容。 (2认同)