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

技术问询:如何提取单日打卡记录的第二、第三时段时间?

解决单日打卡记录提取第二、第三时段时间的问题

要提取单日打卡中的第二、第三时段时间,你可以借助窗口函数+条件聚合的方式实现,原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;

逻辑说明

  1. 子查询排序:用ROW_NUMBER()窗口函数,按ID和日期分组,再按打卡时间升序给每条记录分配序号rn——序号1对应最早的上班打卡,2对应午间外出,3对应午间返回,4对应最晚的下班打卡。
  2. 条件聚合提取:在外层查询中,通过CASE WHEN匹配对应的序号,用MAX(因每个序号唯一,用MIN效果一致)提取对应时段的时间。
  3. 兼容原有逻辑:保留了原SQL用MIN获取第一时段、MAX获取第四时段的逻辑,同时补充了第二、第三时段的提取。

若某天打卡记录不足4条,对应时段字段会返回NULL,符合实际场景需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:35:51