如何按行获取记录日期并仅展示按日期分组最后一条记录的总工时
按日期分组取最后一条记录总工时的解决方案
嘿,针对你的需求——按行获取记录日期,且仅展示每个日期分组下最后一条记录的总工时,我给你整理了两种实用的方案,适配不同的数据库环境:
首先先明确下从示例数据里提炼的关键字段(假设你的表名为work_records):
record_id:记录唯一标识(比如示例里的106、107)work_date:记录日期(如2018-03-18)total_hours:总工时(如03:00)created_at:记录创建时间(用来判断“最后一条”,比如示例里的2018-03-19 09:57:34.750)
方法1:窗口函数(推荐,适用于PostgreSQL、MySQL 8+、SQL Server等现代数据库)
用ROW_NUMBER()窗口函数可以轻松实现分组后取最新记录的需求,代码简洁且高效:
SELECT work_date, total_hours FROM ( SELECT work_date, total_hours, -- 按日期分组,每组内按创建时间倒序编号,最新的记录排第1 ROW_NUMBER() OVER (PARTITION BY work_date ORDER BY created_at DESC) AS row_rank FROM work_records ) AS ranked_data -- 只保留每组的第一条(最新)记录 WHERE row_rank = 1;
关键逻辑说明:
PARTITION BY work_date:把数据按记录日期拆分成不同的组ORDER BY created_at DESC:每个组内的记录按创建时间从新到旧排序,确保最新的记录排在最前面row_rank = 1:筛选出每个组的第一条记录,也就是该日期下的最后一条记录,最终只返回它的日期和总工时
方法2:子查询关联(兼容MySQL 5.x等旧版数据库)
如果你的数据库不支持窗口函数,这种子查询的方式也能实现需求:
SELECT main.work_date, main.total_hours FROM work_records main INNER JOIN ( -- 先找出每个日期对应的最新创建时间 SELECT work_date, MAX(created_at) AS latest_time FROM work_records GROUP BY work_date ) AS latest_dates ON main.work_date = latest_dates.work_date AND main.created_at = latest_dates.latest_time;
注意事项:
- 如果同一日期下有两条记录的
created_at完全相同,这个查询会返回多条结果。遇到这种情况,你可以改用record_id来判断“最后一条”——把子查询里的MAX(created_at)换成MAX(record_id),关联条件改成main.record_id = latest_dates.latest_id即可 - 示例里的
total_hours是HH:MM格式的字符串/时间类型,直接筛选即可,不需要额外转换
针对你提供的示例数据的预期结果
假设2018-03-18的最后一条记录是107号的01:00,2018-03-19的最后一条是108号对应的工时,执行上述查询后会得到类似这样的结果:
| work_date | total_hours |
|---|---|
| 2018-03-18 | 01:00 |
| 2018-03-19 | [108号的工时] |
内容的提问来源于stack exchange,提问作者tamilpriya
相关产品推荐
相关产品推荐

