SQL Server按rsptxt_question_fk分组取最大rsptxt_id_pk对应记录
SQL Server 分组取主键最大值对应记录的查询方案
需求描述
- 针对业务表中每个
rsptxt_question_fk分组,查询组内rsptxt_id_pk值最大的记录对应的rsptxt_text_response及整行其他字段 - 预期返回结果共2条:
(48, abc, 1, 33)、(51, def, 8, 22) - 数据表结构参考样例:

可直接使用的查询写法
写法1:窗口函数实现(推荐,适用于SQL Server 2008及以上版本)
逻辑清晰、执行性能优,通过ROW_NUMBER()给每个分组内的记录按主键倒序打序号,取序号为1的记录即可:
SELECT rsptxt_id_pk, rsptxt_text_response, rsptxt_question_fk, col_33 -- 替换为你表中对应值为33、22的实际字段名 FROM ( SELECT *, ROW_NUMBER() OVER( PARTITION BY rsptxt_question_fk ORDER BY rsptxt_id_pk DESC ) AS row_sort FROM 替换为你的实际表名 ) temp WHERE row_sort = 1
特殊场景说明:如果同一个
rsptxt_question_fk下存在多条记录rsptxt_id_pk值完全相同且都是最大值,需要把所有匹配记录返回时,将ROW_NUMBER()替换为RANK()即可。
写法2:关联子查询实现(兼容所有SQL Server版本)
先聚合查询出每个分组对应的最大主键值,再关联原表匹配到完整记录:
SELECT a.* FROM 替换为你的实际表名 a INNER JOIN ( SELECT rsptxt_question_fk, MAX(rsptxt_id_pk) AS max_pk_id FROM 替换为你的实际表名 GROUP BY rsptxt_question_fk ) b ON a.rsptxt_question_fk = b.rsptxt_question_fk AND a.rsptxt_id_pk = b.max_pk_id
执行效果
两种写法执行后都会返回预期结果:
- 记录1:
rsptxt_id_pk=48,rsptxt_text_response=abc,关联字段值分别为1、33 - 记录2:
rsptxt_id_pk=51,rsptxt_text_response=def,关联字段值分别为8、22
内容的提问来源于stack exchange,提问作者Bear
相关产品推荐
相关产品推荐

