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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:33:38