如何从含日期字段的数据集中提取每日的首条记录?
如何提取每日的首条记录?
嗨,这个需求在数据处理里挺常见的,我给你两种实用的SQL解决方案,适配不同的数据库环境:
方案一:使用窗口函数(推荐,适用于主流数据库)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),用ROW_NUMBER()是最直观的方式。它能帮我们给每个日期组内的记录排序,然后筛选出每组的第一条。假设你的表名为your_table,代码如下:
SELECT id, name, date FROM ( SELECT id, name, date, -- 按日期分组,组内按id升序排序,给每条记录标序号 ROW_NUMBER() OVER (PARTITION BY date ORDER BY id) AS row_num FROM your_table ) temp -- 只取每组的第一条记录 WHERE row_num = 1;
逻辑解释:
PARTITION BY date:把数据按date字段拆分,同一个日期的记录归为一组ORDER BY id:在每个日期组内按id从小到大排序,这样最小的id就对应该日期的首条记录- 外层查询筛选
row_num=1的记录,就是我们要的每日首条
方案二:关联子查询(适配老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用子查询先找到每个日期的最小id,再关联原表获取完整记录:
SELECT t1.id, t1.name, t1.date FROM your_table t1 INNER JOIN ( -- 按日期分组,找出每个日期对应的最小id SELECT date, MIN(id) AS min_id FROM your_table GROUP BY date ) t2 ON t1.date = t2.date AND t1.id = t2.min_id;
逻辑解释:
- 子查询先按
date分组,拿到每个日期的最小id(也就是该日期的首条记录id) - 通过
INNER JOIN把原表和子查询结果关联,匹配到对应id的完整记录
用你提供的测试数据验证,两种方案都会得到你期望的结果:
1 | aaa | 2018-05-10 4 | ddd | 2018-05-11 6 | fff | 2018-05-13
内容的提问来源于stack exchange,提问作者inail
相关产品推荐
相关产品推荐

