如何选取status=1且create/update字段中日期最新的行?
双日期字段筛选最新行的SQL解决方案
示例表数据
| ID | create | status | update |
|---|---|---|---|
| 1 | 2020-09-07 | 0 | 2022-09-07 |
| 2 | 2020-03-25 | 0 | 2022-09-07 |
| 3 | 2021-06-12 | 1 | 2022-09-07 |
| 4 | 2018-10-12 | 1 | 2019-09-07 |
需求说明
筛选出status = 1的行中,create和update两个日期字段里日期最新的行(示例中对应ID=3的行)。
解决方案
方法一:窗口函数法(推荐,适配多数现代数据库)
通过GREATEST()获取每行的最新日期,再用窗口函数按这个日期排序取第一行:
SELECT ID, create, status, update FROM ( SELECT ID, create, status, update, ROW_NUMBER() OVER (ORDER BY GREATEST(create, update) DESC) AS row_rank FROM your_table_name -- 替换成你的实际表名 WHERE status = 1 ) ranked_rows WHERE row_rank = 1;
GREATEST(create, update):提取当前行两个日期里的较大值(即最新日期)ROW_NUMBER():按最新日期倒序给行排名,最新的行排第1- 外层查询取排名为1的行,就是目标结果
如果存在多行同时拥有最大日期,想要返回所有这些行,把ROW_NUMBER()换成RANK()即可。
方法二:先求全局最大日期再匹配
先算出status=1的行中所有日期的最大值,再匹配对应行:
SELECT ID, create, status, update FROM your_table_name -- 替换成你的实际表名 WHERE status = 1 AND GREATEST(create, update) = ( SELECT MAX(GREATEST(create, update)) FROM your_table_name WHERE status = 1 );
- 子查询先拿到
status=1的行里所有create和update的最大日期 - 外层查询筛选出符合条件且行内最大日期等于全局最大日期的记录
这个方法会返回所有拥有最大日期的行(如果有多个的话)。
内容的提问来源于stack exchange,提问作者yalpsid eman
相关产品推荐
相关产品推荐

