如何从同表不同列获取最大日期,按TrackNo分组取对应字段值
分组查询需求实现方案
本次需求可通过窗口函数或子查询关联两种方式实现,具体写法如下:
通用写法(支持MySQL8.0+、PostgreSQL、Oracle、SQL Server等主流支持窗口函数的数据库)
WITH sorted_data AS ( SELECT Accountno, TrackNo, PercentInc, CreateDate, -- 同TrackNo分组内按CreateDate倒序排序,最新的行排名为1 ROW_NUMBER() OVER (PARTITION BY TrackNo ORDER BY STR_TO_DATE(CreateDate, '%d/%m/%Y') DESC) AS rn, -- 同TrackNo分组内计算最大Lastdate MAX(STR_TO_DATE(Lastdate, '%d/%m/%Y')) OVER (PARTITION BY TrackNo) AS group_max_lastdate FROM 你的表名 ) SELECT Accountno, TrackNo, PercentInc, CreateDate, -- 把日期转回原来的dd/mm/yyyy格式输出 DATE_FORMAT(group_max_lastdate, '%d/%m/%Y') AS Lastdate FROM sorted_data WHERE rn = 1;
注意:如果你的表中CreateDate和Lastdate本身就是日期存储类型,无需使用STR_TO_DATE、DATE_FORMAT做转换,直接用字段本身排序、计算最大值即可。不同数据库的日期转换函数略有差异,PostgreSQL可替换为TO_DATE、TO_CHAR,Oracle可替换为TO_DATE、TO_CHAR。
MySQL 5.x兼容写法(无窗口函数场景)
SELECT a.Accountno, a.TrackNo, a.PercentInc, a.CreateDate, DATE_FORMAT(MAX(STR_TO_DATE(b.Lastdate, '%d/%m/%Y')), '%d/%m/%Y') AS Lastdate FROM 你的表名 a -- 关联查询每个TrackNo的最新CreateDate INNER JOIN ( SELECT TrackNo, MAX(STR_TO_DATE(CreateDate, '%d/%m/%Y')) AS max_cdate FROM 你的表名 GROUP BY TrackNo ) c ON a.TrackNo = c.TrackNo AND STR_TO_DATE(a.CreateDate, '%d/%m/%Y') = c.max_cdate -- 关联全表取每个分组的最大Lastdate INNER JOIN 你的表名 b ON a.TrackNo = b.TrackNo GROUP BY a.Accountno, a.TrackNo, a.PercentInc, a.CreateDate;
如果同一个TrackNo存在多条CreateDate完全相同的最新记录,可根据业务需要添加额外去重逻辑。
内容的提问来源于stack exchange,提问作者collie
相关产品推荐
相关产品推荐

