T-SQL需求:跟踪CHANGE_ID任务按时完成状态及标记
T-SQL实现方案优化与跟踪建议
一、优化后的T-SQL代码
WITH ChangeTaskStats AS ( SELECT CHANGE_ID, CHANGE_TARGET, -- 统计已完成任务数,同时标记是否包含TAS003 SUM(CASE WHEN TASK_STATUS = 'COMPLETED' THEN 1 ELSE 0 END) AS CompletedTaskCount, MAX(CASE WHEN TASK_ID = 'TAS003' THEN 1 ELSE 0 END) AS HasTAS003, -- 获取首个逾期或未完成的任务ID MIN(CASE WHEN TASK_STATUS != 'COMPLETED' OR TASK_COMPLETED_DATE > CHANGE_TARGET THEN TASK_ID ELSE NULL END) AS FirstIssueTaskID FROM CRQ_TRACKER GROUP BY CHANGE_ID, CHANGE_TARGET ) SELECT CHANGE_ID, CHANGE_TARGET, -- 标记CHANGE状态:全任务完成+含TAS003才为COMPLETED,否则PENDING CASE WHEN CompletedTaskCount = 3 AND HasTAS003 = 1 THEN 'COMPLETED' ELSE 'PENDING' END AS CHANGE_STATUS, -- 处理缺失TAS003的情况,优先显示TAS003为延迟原因 CASE WHEN HasTAS003 = 0 THEN 'TAS003' ELSE FirstIssueTaskID END AS TASK_DELAY_CAUSED_BY, -- 可选:增加目标日期状态标识,方便跟踪 CASE WHEN CHANGE_TARGET < GETDATE() THEN '已过期' WHEN CHANGE_TARGET BETWEEN GETDATE() AND DATEADD(DAY, 3, GETDATE()) THEN '即将到期' ELSE '未到期' END AS TARGET_DATE_STATUS FROM ChangeTaskStats -- 筛选未达标CHANGE_ID:未全完成、缺TAS003、存在逾期/未完成任务 WHERE CompletedTaskCount < 3 OR HasTAS003 = 0 OR EXISTS ( SELECT 1 FROM CRQ_TRACKER t2 WHERE t2.CHANGE_ID = ChangeTaskStats.CHANGE_ID AND (t2.TASK_STATUS != 'COMPLETED' OR t2.TASK_COMPLETED_DATE > ChangeTaskStats.CHANGE_TARGET) ) ORDER BY CHANGE_TARGET;
二、功能点对应实现说明
- 排查未达标CHANGE_ID:通过聚合统计和子查询,精准筛选出任务未全完成、缺失TAS003、存在逾期/未完成任务的记录
- CHANGE_ID状态标记:只有当完成任务数为3且包含TAS003时,才标记为
COMPLETED,其余情况一律判定为PENDING - 延迟原因任务ID:优先判断是否缺失TAS003,若缺失直接显示TAS003;否则取首个未完成或逾期的任务ID
- 强制检查TAS003:通过聚合函数
MAX(CASE WHEN TASK_ID='TAS003' THEN 1 ELSE 0 END)判断任务是否存在,缺失直接判定为未完成
三、关于TARGET日期跟踪的建议
是否分开跟踪取决于业务需求:
- 如果需要针对性处理不同时间节点的CHANGE_ID,建议拆分跟踪:
- 已过期组:聚焦
CHANGE_TARGET < GETDATE()且状态为PENDING的记录,重点督促完成 - 即将到期组:比如筛选
CHANGE_TARGET在未来3天内且状态为PENDING的记录,提前预警跟进
- 已过期组:聚焦
- 如果只需要统一监控未完成的CHANGE_ID,无需单独拆分,保留结果中的
TARGET_DATE_STATUS字段即可快速区分状态
内容的提问来源于stack exchange,提问作者apex-user
相关产品推荐
相关产品推荐

