求助:MS SQL Server中按SchoolId分组后获取Id最大值对应记录的Review与Point字段
解决方案:MS SQL Server按分组取最大Id对应的字段
针对你在MS SQL Server中按SchoolId分组,获取每个分组内Id最大的行的Review和Point字段的需求,我整理了几种实用的实现方案,都是在SQL Server中经过验证的:
方案1:使用ROW_NUMBER()窗口函数(推荐)
这是最直观且易维护的方案,利用窗口函数给每个分组内的行按Id降序编号,然后筛选出编号为1的行:
SELECT SchoolId, Review, Point FROM ( SELECT SchoolId, Review, Point, ROW_NUMBER() OVER (PARTITION BY SchoolId ORDER BY Id DESC) AS RowNum FROM SchoolReview ) AS RankedReviews WHERE RowNum = 1;
说明:
PARTITION BY SchoolId:按SchoolId对数据进行分组ORDER BY Id DESC:每个分组内按Id从大到小排序,确保最大的Id排在第一位- 外层查询筛选
RowNum = 1的行,就是每个分组里Id最大的那一行
方案2:子查询关联法
先通过子查询找出每个SchoolId对应的最大Id,再关联原表获取对应的字段:
SELECT sr.SchoolId, sr.Review, sr.Point FROM SchoolReview sr INNER JOIN ( SELECT SchoolId, MAX(Id) AS MaxId FROM SchoolReview GROUP BY SchoolId ) AS MaxIds ON sr.SchoolId = MaxIds.SchoolId AND sr.Id = MaxIds.MaxId;
说明:
- 子查询先按
SchoolId分组,计算出每个组的最大Id - 再通过
INNER JOIN关联原表,精准匹配到每个SchoolId对应最大Id的完整行数据
方案3:使用TOP 1 WITH TIES(简洁写法)
这种写法代码更紧凑,利用TOP 1 WITH TIES结合窗口函数一次性返回所有分组的目标行:
SELECT TOP 1 WITH TIES SchoolId, Review, Point FROM SchoolReview ORDER BY ROW_NUMBER() OVER (PARTITION BY SchoolId ORDER BY Id DESC);
说明:
TOP 1 WITH TIES会返回所有与第一行排序值相同的行,这里每个分组的第一行就是Id最大的行,因此能一次性获取所有分组的目标数据
以上三种方案运行后,都能得到你期望的结果:
| SchoolId | Review | Point |
|---|---|---|
| 1 | rv2 | 7 |
| 2 | rv4 | 7 |
| 3 | rv6 | 8 |
如果你的SQL Server版本是2008及以上,优先推荐方案1,它的扩展性更好(比如后续需要按其他字段排序,只需修改ORDER BY部分);如果是更旧的版本,方案2的兼容性更强。
内容的提问来源于stack exchange,提问作者far
相关产品推荐
相关产品推荐

