SQL Server生产操作结果进度追踪:带条件NULL的视图构建
解决方案
要实现你需要的视图,核心逻辑是追踪每个操作尝试时间点上已成功完成的操作集合,再根据当前尝试的操作动态填充各列值:已完成的操作显示1,当前正在重试的操作显示本次结果,未开始的操作显示NULL。
步骤解析
- 标记操作成功的时间点:先获取每个操作第一次成功的记录ID,以此判断后续记录是否已完成该操作。
- 计算每个记录的进度:对每条操作记录,确定截止到当前记录时,已成功完成的最大操作编号。
- 透视生成目标列:针对每个操作列,通过条件判断填充对应值:
- 若操作已完成,显示1;
- 若当前记录属于该操作且前置操作已完成,显示本次结果;
- 其余情况显示NULL。
完整SQL代码
CREATE VIEW OperationProgress AS WITH OpSuccess AS ( -- 记录每个操作第一次成功的ID SELECT OP, MIN(id) AS success_id FROM Operations WHERE Outcome = 1 GROUP BY OP ), OpProgress AS ( -- 计算每条记录对应的当前操作,以及截止到该记录时已完成的最大操作编号 SELECT o.id, o.OP AS current_op, o.Outcome AS current_outcome, MAX(CASE WHEN os.success_id <= o.id THEN os.OP ELSE 0 END) OVER (ORDER BY o.id) AS max_completed_op FROM Operations o LEFT JOIN OpSuccess os ON o.OP = os.OP ) -- 透视生成目标格式的列 SELECT CASE WHEN 1 <= max_completed_op THEN 1 WHEN current_op = 1 THEN current_outcome ELSE NULL END AS [OP 1 Outcome], CASE WHEN 2 <= max_completed_op THEN 1 WHEN current_op = 2 AND 1 <= max_completed_op THEN current_outcome ELSE NULL END AS [OP 2 Outcome], CASE WHEN 3 <= max_completed_op THEN 1 WHEN current_op = 3 AND 2 <= max_completed_op THEN current_outcome ELSE NULL END AS [OP 3 Outcome], CASE WHEN 4 <= max_completed_op THEN 1 WHEN current_op = 4 AND 3 <= max_completed_op THEN current_outcome ELSE NULL END AS [OP 4 Outcome], CASE WHEN 5 <= max_completed_op THEN 1 WHEN current_op = 5 AND 4 <= max_completed_op THEN current_outcome ELSE NULL END AS [OP 5 Outcome] FROM OpProgress ORDER BY id;
结果验证
执行该视图后,会生成符合你需求的输出:
- 前两行对应OP1的两次失败尝试,后续操作列均为NULL;
- OP1成功后,所有后续行的OP1列固定显示1;
- OP2、OP3成功后,对应列在后续行固定显示1;
- OP4重试期间,OP5列保持NULL,直到OP4成功后,OP5列才显示自身的尝试结果。
内容的提问来源于stack exchange,提问作者drypatrick
相关产品推荐
相关产品推荐

