如何筛选数据表中日期最新(最大)的多行数据
筛选数据表中最新日期行的解决方案
方法1:窗口函数(推荐)
这是目前最简洁高效的方案,支持MySQL 8.0+、PostgreSQL、SQL Server等主流数据库:
WITH ranked_data AS ( SELECT *, -- 按分组字段划分组,每组内按日期倒序排名 ROW_NUMBER() OVER (PARTITION BY 分组字段 ORDER BY 日期字段 DESC) AS rn FROM 你的主表名 ) SELECT * FROM ranked_data WHERE rn = 1;
- 把
分组字段换成你需要的分组列(比如用户ID、产品ID,用来确定“最新”是针对哪个维度) - 把
日期字段替换成存储日期的列名 - 排名为1的行就是每个分组里日期最新的记录
方法2:子查询关联(兼容旧版数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用这种方式:
SELECT t1.* FROM 你的主表名 t1 JOIN ( -- 先找出每个分组的最大日期 SELECT 分组字段, MAX(日期字段) AS max_date FROM 你的主表名 GROUP BY 分组字段 ) t2 ON t1.分组字段 = t2.分组字段 AND t1.日期字段 = t2.max_date;
方法3:NOT EXISTS 写法
通过判断当前行是否是分组内日期最大的记录来筛选:
SELECT t1.* FROM 你的主表名 t1 WHERE NOT EXISTS ( SELECT 1 FROM 你的主表名 t2 WHERE t2.分组字段 = t1.分组字段 AND t2.日期字段 > t1.日期字段 );
特殊情况:取整个表的最新日期行
如果不需要分组,只想拿全表日期最大的那一行,直接用下面的语句:
SELECT * FROM 你的主表名 WHERE 日期字段 = (SELECT MAX(日期字段) FROM 你的主表名);
内容的提问来源于stack exchange,提问作者Christoper Bintang Sangjaya
相关产品推荐
相关产品推荐

