MySQL中参数列值相同时查询最新编辑时间的记录
按双参数分组取最新编辑记录的SQL写法
场景说明
待查询表包含4个字段:
Filename:存储文件名Edited:存储文件最后编辑时间PARAMETER1:业务参数1PARAMETER2:业务参数2
表内样例数据:
- file1.csv:编辑时间2022-06-08 17:23:16,PARAMETER1值为RED,PARAMETER2值为BLUE
- file2.csv:编辑时间2022-06-09 15:54:45,PARAMETER1值为GREEN,PARAMETER2值为YELLOW
- file3.csv:编辑时间2022-06-15 14:52:40,PARAMETER1值为RED,PARAMETER2值为BLUE
需求为按PARAMETER1和PARAMETER2的取值组合分组,仅返回每组中编辑时间最新的完整行记录,预期返回file2.csv、file3.csv两条结果。
直接使用GROUP BY语法时,受SQL模式限制,很容易出现非分组字段取值和最大时间不匹配的问题,之前尝试写的关联子查询也存在笔误导致结果不准。
原有SQL的错误点
之前写的SQL子查询中,最后一个关联条件写为u2.PARAMETER2 = u2.PARAMETER2,这个条件恒为真,相当于没有对PARAMETER2做分组匹配,会导致返回结果不符合预期。
可直接使用的实现方案
方案1:修正后的关联子查询(全SQL版本兼容)
逻辑简单,不需要依赖数据库新特性,修正关联条件即可使用:
SELECT u1.* FROM 你的表名 u1 WHERE u1.Edited = ( SELECT MAX(u2.Edited) FROM 你的表名 u2 WHERE u2.PARAMETER1 = u1.PARAMETER1 AND u2.PARAMETER2 = u1.PARAMETER2 );
注意:如果同一参数组下存在多条编辑时间完全相同的记录,该写法会将这些记录全部返回。
方案2:窗口函数实现(支持MySQL8.0+、PostgreSQL、SQL Server等主流数据库新版本)
查询性能更优,逻辑更直观,通过窗口函数按参数组分片、按编辑时间倒序排序后取每组第一条:
SELECT Filename, Edited, PARAMETER1, PARAMETER2 FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY PARAMETER1, PARAMETER2 ORDER BY Edited DESC ) AS row_rank FROM 你的表名 ) t WHERE row_rank = 1;
注意:如果需要保留同组内编辑时间并列最新的所有记录,将
ROW_NUMBER()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者Darkmoon
相关产品推荐
相关产品推荐

