技术问询:如何提取单日打卡记录的第二、第三时段时间?
解决单日打卡记录提取第二、第三时段时间的问题
要提取单日打卡中的第二、第三时段时间,你可以借助窗口函数+条件聚合的方式实现,原SQL仅通过MIN和MAX只能获取最早(第一时段)和最晚(第四时段)的记录,中间时段需要先给打卡时间排序再提取。
完善后的SQL语句
SELECT x."ID", MIN(x."FECHA") AS "1pos", MAX(CASE WHEN rn = 2 THEN x."FECHA" END) AS "2pos", MAX(CASE WHEN rn = 3 THEN x."FECHA" END) AS "3pos", MAX(x."FECHA") AS "4pos" FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY "ID", DATE_TRUNC('day', "FECHA") ORDER BY "FECHA" ASC ) AS rn FROM sirha7.v_marcaciones WHERE "CEDULA" = '0401219282' AND CAST("FECHA" AS date) = '2022-12-27' ) x GROUP BY x."ID", DATE_TRUNC('day', x."FECHA") ORDER BY "1pos" DESC;
逻辑说明
- 子查询排序:用
ROW_NUMBER()窗口函数,按ID和日期分组,再按打卡时间升序给每条记录分配序号rn——序号1对应最早的上班打卡,2对应午间外出,3对应午间返回,4对应最晚的下班打卡。 - 条件聚合提取:在外层查询中,通过
CASE WHEN匹配对应的序号,用MAX(因每个序号唯一,用MIN效果一致)提取对应时段的时间。 - 兼容原有逻辑:保留了原SQL用
MIN获取第一时段、MAX获取第四时段的逻辑,同时补充了第二、第三时段的提取。
若某天打卡记录不足4条,对应时段字段会返回NULL,符合实际场景需求。
内容的提问来源于stack exchange,提问作者Michael Avila
相关产品推荐
相关产品推荐

