如何按number字段分组获取各分组MAX(changeNo)对应的关联行
解决按number分组取最大changeNo行的问题
嘿,我懂你的需求了——你现在的SQL语句取到的是全表全局最大的changeNo,但你真正想要的是每个number分组里,对应最大changeNo的那一行数据,还要关联table2里的note字段对吧?咱们来调整一下查询语句,给你两种常用的解决方案:
方法一:关联子查询(兼容多数数据库版本)
这种写法不用依赖窗口函数,在老版本的MySQL等数据库里也能跑通:
SELECT T0.id, T0.number, T0.date, T0.changeNo, T1.note FROM table T0 INNER JOIN table2 T1 ON T0.joinID = T1.joinID WHERE T0.changeNo = ( SELECT MAX(changeNo) FROM table WHERE number = T0.number -- 关键:子查询只取当前外层行同number的最大changeNo )
核心改动就是在子查询里加了WHERE number = T0.number,这样子查询就不是全局找最大值,而是针对当前行的number,去匹配该分组下的最大changeNo,从而筛选出每个number组里最新的那一行。
方法二:窗口函数(更直观,适合现代数据库)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),用ROW_NUMBER()的写法逻辑更清晰:
WITH ranked_data AS ( SELECT T0.id, T0.number, T0.date, T0.changeNo, T1.note, -- 按number分组,每组内按changeNo倒序排,给行编号 ROW_NUMBER() OVER (PARTITION BY T0.number ORDER BY T0.changeNo DESC) AS rn FROM table T0 INNER JOIN table2 T1 ON T0.joinID = T1.joinID ) SELECT id, number, date, changeNo, note FROM ranked_data WHERE rn = 1; -- 取每组里编号为1的行(也就是changeNo最大的行)
PARTITION BY T0.number:把数据按number分成不同的组ORDER BY T0.changeNo DESC:每个组内按changeNo从大到小排序- 如果同一个
number下有多个行的changeNo是相同的最大值,ROW_NUMBER()会随机选一行;要是想保留所有这些行,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。
举个例子,用你给的示例数据:
id|number|date|changeNo|note
01|150052|1603|00000001|0x22
02|150052|1603|00000002|0x45
用上面的两种查询,都会返回id为02的那一行数据,也就是number=150052分组里changeNo最大的记录。
内容的提问来源于stack exchange,提问作者quake
相关产品推荐
相关产品推荐

