SQL实现从两列提取唯一值并获取ID对应最新日期
获取每个ID对应的最新日期(提取唯一ID+最新日期)
没问题,这种同一个ID对应多个日期导致重复的场景太常见了!我给你几种实用的SQL方案,帮你快速得到每个ID对应的最新日期,完美满足你提取两列唯一值的需求。
假设你的表名为your_table,ID列是id,日期列是date_column(记得替换成你实际的表名和列名哦):
方法1:窗口函数(推荐,适配绝大多数现代数据库)
窗口函数是最直观高效的方式,尤其适合数据量较大的场景。我们用ROW_NUMBER()给每个ID的记录按日期倒序编号,然后只取编号为1的那条(也就是最新的记录):
SELECT id, date_column FROM ( SELECT id, date_column, -- 按ID分组,每组内按日期从新到旧排序,给每条记录编号 ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_column DESC) AS row_num FROM your_table ) AS temp WHERE row_num = 1;
如果同一个ID在同一天有多条记录,你想保留所有这些最新日期的记录,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK(),这样同日期的记录会得到相同的编号,不会被过滤掉。
方法2:GROUP BY + MAX()(极简方案,仅需两列时首选)
既然你只需要ID和日期两列,这种方式最简洁直接:
SELECT id, MAX(date_column) AS latest_date FROM your_table GROUP BY id;
它会自动按ID分组,直接取出每组中最大的日期值,结果就是每个ID对应的最新日期,天然去重。
方法3:子查询关联(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.7及更早版本),可以用子查询关联的方式实现:
SELECT t1.id, t1.date_column FROM your_table t1 INNER JOIN ( -- 先拿到每个ID的最新日期 SELECT id, MAX(date_column) AS latest_date FROM your_table GROUP BY id ) t2 ON t1.id = t2.id AND t1.date_column = t2.latest_date;
这个方法先通过子查询获取每个ID的最新日期,再关联原表拿到对应的完整记录。
小提示
- 如果你的日期列是带时间的
datetime类型,MAX()函数同样能正确识别最新的时间点。 - 如果存在NULL值,可以根据业务需求在
MAX()里加上COALESCE处理,或者提前过滤掉NULL记录。
内容的提问来源于stack exchange,提问作者frisbeee
相关产品推荐
相关产品推荐

