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

如何用SQL识别timesheet_data表中员工连续2个月以上考勤记录中断

解决方案:识别考勤中断超过2个月的员工

原查询的核心问题是未正确捕捉考勤记录之间的连续中断,仅检查了单条记录后1-2个月的存在性,无法覆盖“中断后恢复填写”的场景。以下是修正后的思路和代码:

核心思路

  1. 对每个员工(按id+countrynm分组)的考勤记录按日期排序,计算相邻记录的时间间隔。
  2. 同时检查员工最后一条考勤记录到查询截止日期的间隔,避免遗漏“最后一次记录后长期中断”的情况。
  3. 筛选出任意间隔超过2个月的员工,去重后得到结果。

修正后的SQL(以BigQuery为例)

WITH ordered_timesheets AS (
  -- 为每个员工的考勤记录排序,标记上一条记录日期和最后一条记录日期
  SELECT
    id,
    countrynm,
    date_column,
    LAG(date_column) OVER (PARTITION BY id, countrynm ORDER BY date_column) AS prev_attendance_date,
    MAX(date_column) OVER (PARTITION BY id, countrynm) AS last_attendance_date
  FROM timesheet_data
  WHERE 
    countrynm = 'India'
    AND date_column BETWEEN '2023-03-01' AND '2023-07-01'
),
gap_calculations AS (
  -- 计算相邻考勤记录的间隔
  SELECT
    id,
    countrynm,
    DATE_DIFF(date_column, prev_attendance_date, MONTH) AS months_since_last_attendance
  FROM ordered_timesheets
  WHERE prev_attendance_date IS NOT NULL -- 排除第一条记录(无前驱)
  
  UNION ALL
  
  -- 计算最后一条记录到查询截止日的间隔
  SELECT
    id,
    countrynm,
    DATE_DIFF('2023-07-01', last_attendance_date, MONTH) AS months_since_last_attendance
  FROM ordered_timesheets
  WHERE date_column = last_attendance_date -- 仅取每个员工的最后一条记录
)
-- 筛选出存在超过2个月中断的员工
SELECT DISTINCT id, countrynm
FROM gap_calculations
WHERE months_since_last_attendance > 2
ORDER BY id;

针对双周考勤的精准调整

如果需要更精准匹配双周考勤规则(比如中断超过2个月即缺失≥4个双周记录),可将时间间隔改为按天数计算:

-- 修改gap_calculations中的条件为天数
WHERE DATE_DIFF(date_column, prev_attendance_date, DAY) > 60 -- 2个月按60天估算
-- 或针对最后一条记录:
WHERE DATE_DIFF('2023-07-01', last_attendance_date, DAY) > 60

原查询的问题总结

  • 逻辑错误:通过LEFT JOIN查找单条记录后1-2个月的记录,无法识别“中间中断后恢复”的场景。
  • 信息缺失:仅返回最后考勤日期,未捕捉中间的中断间隔。
  • 冗余关联:关联subscriber_base表但未使用,可直接移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:37:09