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

如何用SQL计算员工完成关键任务的连续天数?

计算员工连续完成关键任务的天数解决方案

不用循环,用窗口函数就能高效解决这个问题,核心思路是先给每个员工的连续关键任务段打上分组标记,再在分组内计数。

假设你的临时表名为#EmployeeTasks,字段分别是员工(EmployeeName)、日期(TaskDate)、Task_List、Critical_Task,可以用下面的SQL语句计算Consec_Days_Crit_Task:

SELECT 
    EmployeeName AS 员工,
    TaskDate AS 日期,
    Task_List,
    Critical_Task,
    CASE 
        WHEN Critical_Task = 1 THEN 
            ROW_NUMBER() OVER (
                PARTITION BY EmployeeName, GroupId 
                ORDER BY TaskDate
            )
        ELSE 0 
    END AS Consec_Days_Crit_Task
FROM (
    SELECT 
        *,
        -- 按员工分区,按日期排序,累计统计前面出现的0的数量,以此作为分组标识
        SUM(CASE WHEN Critical_Task = 0 THEN 1 ELSE 0 END) OVER (
            PARTITION BY EmployeeName 
            ORDER BY TaskDate 
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        ) AS GroupId
    FROM #EmployeeTasks
) AS GroupedTasks
ORDER BY EmployeeName, TaskDate;

逻辑说明:

  1. 分组标记(GroupId):按员工分区,按日期顺序遍历记录,每遇到一条Critical_Task=0的记录,就给后续的记录加一个分组编号。这样连续的Critical_Task=1的记录会被分到同一个GroupId下,一旦出现0,分组就会切换。
  2. 连续天数计数:在每个员工+GroupId的分区内,对Critical_Task=1的记录按日期排序生成行号,这行号就是连续完成关键任务的天数;Critical_Task=0的记录直接返回0。

执行结果(和示例匹配):

员工日期Task_ListCritical_TaskConsec_Days_Crit_Task
Tom J10/1/22Sweep, Lock Door*11
Tom J10/2/22Sweep, Lock Door*12
Tom J10/3/22Mop, Dishes00
Tom J10/4/22Sweep, Lock Door*11
Sue B10/1/22Mop, Dishes00
Sue B10/2/22Mop, Dishes00
Sue B10/3/22Sweep, Lock Door*11
Sue B10/4/22Mop, Dishes00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:05:25