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;
方案说明
- 窗口函数
ROW_NUMBER():通过PARTITION BY指定分组字段,ORDER BYdateDESC确保每组内最新的数据排在前面并编号为1,依次往后。 - 过滤逻辑:外层查询筛选
row_num <= 2,直接保留每组的前2条最新数据。 - 性能优化:相比子查询关联的方式,窗口函数在MySQL 8.0中执行效率更高,且逻辑更清晰。
结果对比
原始查询会返回每组所有历史数据,修改后的查询会严格保留每组最多2条最新记录,与你给出的期望结果完全一致。
内容的提问来源于stack exchange,提问作者Neurobion
相关产品推荐
相关产品推荐

