You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按行获取记录日期并仅展示按日期分组最后一条记录的总工时

按日期分组取最后一条记录总工时的解决方案

嘿,针对你的需求——按行获取记录日期,且仅展示每个日期分组下最后一条记录的总工时,我给你整理了两种实用的方案,适配不同的数据库环境:

首先先明确下从示例数据里提炼的关键字段(假设你的表名为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_datetotal_hours
2018-03-1801:00
2018-03-19[108号的工时]

内容的提问来源于stack exchange,提问作者tamilpriya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:11:25