希望有人可以提供帮助。 我一直在尝试一些查询,但似乎没有得到理想的结果。
我需要在表格中找出最高“声称”的用户,而不会丢弃最终报告中的列。
用户可以在表格中拥有多条记录,但数据将完全不同,因为只有用户才能匹配。
以下查询仅向我提供每位用户的计数,而不向我提供详细信息。
SELECT User, count (*) total_record
FROM mytable
GROUP BY User
ORDER BY count(*) desc
表:
mytable
Column 1 = User Column 2 = Ref Number Column 3 = Date
第一列将是唯一标识符,但其他列中的数据会有所不同,因此需要将声称最高的用户下载所有相关行,并将用户提交给声称最少的用户。
User|Ref Num|Date
1|a|20150317
1|b|20150317
2|c|20150317
3|d|20150317
4|e|20150317
1|f|20150317
4|e|20150317
以下数据是如何返回值。
User|Ref Num|Date|Count
1|a|20150317|3
1|b|20150317|3
1|f|20150317|3
2|c|20150317|1
3|d|20150317|1
4|e|20150317|2
4|e|20150317|2
希望它有意义。
谢谢
答案 0 :(得分:1)
如果要按每个用户的记录数排序,则使用窗口函数而不是聚合:
SELECT t.*
FROM (SELECT t., count(*) OVER (partition by user) as cnt
FROM mytable t
) t
ORDER BY cnt DESC, user;
请注意,我已将user
添加到order by
,因此具有相同计数的用户将一起显示在列表中。
答案 1 :(得分:1)
在您使用MSSQL时,您可以使用OVER()
子句,如下所示:
SELECT [user], mt.ref_num, mt.[date], COUNT(mt.[user]) OVER(PARTITION BY mt.[user])
FROM myTable mt
有关OVER
子句的更多信息,请访问:https://msdn.microsoft.com/en-us/library/ms189461.aspx
根据您的评论,您可以使用通配符*
,如下所示:
SELECT mt.*, COUNT(mt.[user]) OVER(PARTITION BY mt.[user])
FROM myTable mt
这将为您提供每一列以及计数结果。
答案 2 :(得分:1)
如果您的SQL Server版本支持,则可以使用outer apply
:
SELECT [User], [Ref Num], Date, total_record
FROM mytable M
OUTER APPLY (
SELECT count(*) total_record
FROM mytable
WHERE [user] = M.[user]
GROUP BY [user]
) oa
ORDER BY total_record desc, [user]
请注意,user
是MSSQL中的保留关键字,您需要将其括在括号[user]
或双引号"user"
中。
这将产生如下输出:
user Ref Num Date total_record
1 a 2015-03-17 3
1 b 2015-03-17 3
1 f 2015-03-17 3
4 e 2015-03-17 2
4 e 2015-03-17 2
2 c 2015-03-17 1
3 d 2015-03-17 1
请注意,使用count(*) OVER (partition by [user])
构造的答案更有效。
答案 3 :(得分:0)
最简单的方法是使用窗口函数。
SELECT table.*, COUNT(*) OVER (PARTITION BY user)
FROM nameoftable table -- this is an alias
ORDER BY user, ref_num
这似乎也符合你的需要。
答案 4 :(得分:0)
这是做旧的方式。在可能的情况下,你应该使用OVER
,但正如其他人已回答的那样,我认为我会把这个放进去。
SELECT
T.[User]
,T.[Ref Num]
,T.[Date]
,(SELECT count(*) from [myTable] T2 where T2.[User] = T.[USER]) as [Count]
FROM [mytable] T
ORDER BY [Count] DESC