我发现了一个与此问题非常相似的问题,但使用了Oracle独有的功能.我希望在sql Server中执行此操作.
我有这样一张桌子:
MyTable -------------------- MyTableID INT PK UserID INT Counter INT
每个用户可以有多行,每行的Counter值不同.我需要为每个用户找到具有最高Counter值的行.
我该如何在sql Server 2005中执行此操作?
我能想到的最好的是一个查询返回每个UserID的MAX(计数器),但我需要整行,因为为了简单起见,我的表定义中没有显示此表中的其他数据.
编辑:我从这篇文章的一些答案中引起了我的注意,我忘记了一个重要的细节.可以有2行,其中UserID可以具有相同的MAX计数器值.下面的示例更新了预期的数据/输出应该是什么.
有了这些数据:
MyTableID UserID Counter --------- ------- -------- 1 1 4 2 1 7 3 4 3 4 11 9 5 11 3 6 4 6 ... 9 11 9
我想要重复MAX值的这些结果,选择sql Server选择它们的任何顺序的第一次出现.在这种情况下返回哪些行并不重要,只要UserID / Counter对是不同的:
MyTableID UserID Counter --------- ------- -------- 2 1 7 4 11 9 6 4 6
解决方法
我喜欢在这种情况下使用公用表表达式,其中包含一个合适的ROW_NUMBER()函数:
WITH MaxPerUser AS ( SELECT MyTableID,UserID,Counter,ROW_NUMBER() OVER(PARTITION BY userid ORDER BY Counter DESC) AS 'RowNumber' FROM dbo.MyTable ) SELECT MyTableID,Counter FROM MaxPerUser WHERE RowNumber = 1
通过UserID对数据进行分区,按每个用户的Counter(降序)对其进行排序,然后为每个用户标记以1开头的每一行.只选择rownumber为1的那些行,并且你有最大值.每个用户的价值.
就这么简单:-)我得到的结果是这样的:
MyTableID UserID Counter 2 1 7 6 4 6 4 11 9