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

如何在MySQL中获取每个rate对应的最后更新记录?

解决方案:查询每个rate对应的最后一条更新记录

没问题,针对你要查询每个rate对应最后一条更新记录的需求,我给你整理了几种实用的MySQL解决方案,适配不同版本的MySQL:

首先先还原你的数据表结构和数据(注意update是MySQL关键字,所以需要用反引号包裹):

CREATE TABLE your_table (
    record INT,
    rate INT,
    `update` INT
);

INSERT INTO your_table VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 1, 4),
(5, 2, 1),
(6, 2, 2),
(7, 3, 1),
(8, 3, 2),
(9, 3, 3);

方法1:子查询关联(兼容所有MySQL版本)

这是兼容性最好的方案,不管你用的是哪个版本的MySQL都能正常运行:

SELECT t.*
FROM your_table t
INNER JOIN (
    -- 先获取每个rate对应的最大update值
    SELECT rate, MAX(`update`) AS max_update
    FROM your_table
    GROUP BY rate
) AS t_max 
ON t.rate = t_max.rate AND t.`update` = t_max.max_update;

原理:先通过子查询统计出每个rate的最大更新值,再和原表关联匹配,就能拿到对应的完整记录。

方法2:窗口函数(MySQL 8.0+ 推荐使用)

如果你的MySQL版本是8.0及以上,窗口函数的写法会更简洁直观:

SELECT record, rate, `update`
FROM (
    SELECT 
        *,
        -- 按rate分组,每组内按update降序排序,给每条记录编号
        ROW_NUMBER() OVER (PARTITION BY rate ORDER BY `update` DESC) AS rn
    FROM your_table
) AS t
WHERE rn = 1;
  • 说明:ROW_NUMBER()会给每个rate组内的记录按update从大到小编号,取编号为1的就是该rate的最后一条更新记录。
  • 扩展:如果同一个rate存在多条update值相同的“最后记录”,想要全部保留的话,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。

方法3:GROUP BY 聚合(仅适用于record与update同步递增的场景)

如果你的数据表中record和update是同步递增的(像你给出的示例数据这样),也可以用GROUP BY直接聚合,但这个方法有局限性,仅当record和update的递增逻辑完全一致时才准确:

SELECT 
    MAX(record) AS record,
    rate,
    MAX(`update`) AS `update`
FROM your_table
GROUP BY rate;

执行以上任意一种查询,都能得到你想要的结果:

record | rate | update
-------|------|-------
4      | 1    | 4
6      | 2    | 2
9      | 3    | 3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:13:01