如何使用T-SQL按ID和Visit_No提取最大Room数的记录?
T-SQL提取每个ID+Visit_No组合下Room最大的记录
你提到的ROW_SEQUENCE应该是打错了,正确的函数是ROW_NUMBER(),这是处理这类分组取最值场景最常用的方法,下面给你两种可行的方案:
方案一:使用ROW_NUMBER()窗口函数
这种方法通过窗口函数给每个ID+Visit_No分组内的行按Room降序编号,取编号为1的行就是该分组下Room最大的记录:
WITH RankedRooms AS ( SELECT ID, Visit_No, Room, -- 按ID和Visit_No分组,每组内按Room降序排,最大的Room行编号为1 ROW_NUMBER() OVER (PARTITION BY ID, Visit_No ORDER BY Room DESC) AS RowNum FROM YourTable -- 替换成你的实际表名 ) SELECT ID, Visit_No, Room FROM RankedRooms WHERE RowNum = 1;
如果同一分组下存在多个行的Room值都是最大值,ROW_NUMBER()会随机给它们编不同的号,只返回其中一行。若需要保留所有并列最大值的行,把ROW_NUMBER()换成RANK()或者DENSE_RANK()即可。
方案二:分组子查询关联原表
如果你对窗口函数不太熟悉,也可以用分组子查询先找出每个ID+Visit_No对应的最大Room值,再关联原表获取完整记录:
SELECT t.ID, t.Visit_No, t.Room FROM YourTable t INNER JOIN ( -- 先分组找出每个ID+Visit_No的最大Room值 SELECT ID, Visit_No, MAX(Room) AS MaxRoom FROM YourTable GROUP BY ID, Visit_No ) sub ON t.ID = sub.ID AND t.Visit_No = sub.Visit_No AND t.Room = sub.MaxRoom;
这种方法会返回同一分组下所有Room等于最大值的行,适合需要保留所有并列最大值记录的场景。
内容的提问来源于stack exchange,提问作者SeanLearningSQL
相关产品推荐
相关产品推荐

