设置用户的最高记录

时间:2015-03-20 12:12:49

标签: sql sql-server tsql

希望有人可以提供帮助。 我一直在尝试一些查询,但似乎没有得到理想的结果。

我需要在表格中找出最高“声称”的用户,而不会丢弃最终报告中的列。

用户可以在表格中拥有多条记录,但数据将完全不同,因为只有用户才能匹配。

以下查询仅向我提供每位用户的计数,而不向我提供详细信息。

  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

希望它有意义。

谢谢

5 个答案:

答案 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