You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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最大的行,因此能一次性获取所有分组的目标数据

以上三种方案运行后,都能得到你期望的结果:

SchoolIdReviewPoint
1rv27
2rv47
3rv68

如果你的SQL Server版本是2008及以上,优先推荐方案1,它的扩展性更好(比如后续需要按其他字段排序,只需修改ORDER BY部分);如果是更旧的版本,方案2的兼容性更强。

内容的提问来源于stack exchange,提问作者far

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 12:27:26