加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

获取SQL Server中具有Max值的行

发布时间:2020-12-12 08:56:04 所属栏目:MsSql教程 来源:网络整理
导读:我发现了一个与此问题非常相似的问题,但使用了Oracle独有的功能.我希望在SQL Server中执行此操作. 我有这样一张桌子: MyTable--------------------MyTableID INT PKUserID INTCounter INT 每个用户可以有多行,每行的Counter值不同.我需要为每个用户找到具有
我发现了一个与此问题非常相似的问题,但使用了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

每个用户只有一个条目,无论每个用户有多少行具有相同的最大值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读