用于查找count> 1的logging的SQL查询

我有一个名为PAYMENT的表。 在这个表格中,我有一个用户ID,一个帐号,一个邮政编码和一个date。 我想find所有用户每天有多个支付相同帐号的所有logging。

更新:此外,应该有一个filter,而不是只计算其邮编不同的logging。

这是表格的样子:

  |  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查询中expression这一点? 我在想自己join,但由于某种原因,我的计数是错误的。

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

下面会发现

所有使用相同帐号的每天付费多于一次的用户

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

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

我不清楚这个表的关键是什么(这是完全正常化 ,我想知道?),因此我觉得很难遵循你的规范:

我想find所有用户每天有多个支付相同的帐户号码的所有logging…此外,应该有一个filter,而不是只计算其邮政编码是不同的logging。

所以我采取了字面解释。

下面是更详细的,但可以更容易理解,因此保持(我已经使用CTE的表PAYMENT_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 ); 
  delete t1 from @tbl t1 where 1<(select count(ID) from @tbl where ID=t1.ID)