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

MySQL 8.0.31查询优化:按组合列分组保留最新2条数据

按指定分组保留最新2条数据的SQL优化方案

针对你的需求——按clusterName、aksNamespace、acrName、acrImageName组成的分组保留最新2条数据,利用MySQL 8.0+支持的窗口函数ROW_NUMBER()可以高效实现。

修改后的SQL查询

SELECT 
    clusterName,
    aksNamespace,
    acrName,
    acrImageName,
    acrImageVersion,
    `date`
FROM (
    SELECT 
        clusterName,
        aksNamespace,
        acrName,
        acrImageName,
        acrImageVersion,
        `date`,
        -- 按指定分组排序,给每组内的行编号,最新的排第1
        ROW_NUMBER() OVER (
            PARTITION BY clusterName, aksNamespace, acrName, acrImageName
            ORDER BY `date` DESC
        ) AS row_num
    FROM aks_images
    WHERE acrName = "storage"
) AS t
-- 只保留每组内前2条数据
WHERE row_num <= 2
ORDER BY clusterName, acrImageName, `date` DESC;

方案说明

  1. 窗口函数ROW_NUMBER():通过PARTITION BY指定分组字段,ORDER BY date DESC确保每组内最新的数据排在前面并编号为1,依次往后。
  2. 过滤逻辑:外层查询筛选row_num <= 2,直接保留每组的前2条最新数据。
  3. 性能优化:相比子查询关联的方式,窗口函数在MySQL 8.0中执行效率更高,且逻辑更清晰。

结果对比

原始查询会返回每组所有历史数据,修改后的查询会严格保留每组最多2条最新记录,与你给出的期望结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:24:21