用于查找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)