首页 > 解决方案 > 对于 SQL Server 中的此类数据,我应该使用什么循环?

问题描述

我有一个包含 3 列状态、下一个状态和默认值(0,1)的数据列表。我如何遍历数据并获得默认 = 1 的最后状态。

这是我的表的样子。

ID        Status    Next Status    Default
--------------------------------
 1          PASS       FAIL           0
 2          PASS       HOLD           0
 3          PASS       RELE           1
 4          FAIL       EXEM           0
 5          FAIL       HOLD           1
 6          HOLD       RELE           0
 7          RELE       HOLD           0
 8          RELE       CANC           0

例如 my Statusis PASS,现在它将在表中循环并检查默认 = 1 的最后一个状态。

示例 1:通过 - RELE - 1

由于 RELE 处于下一个状态,它将查看 RELE。

RELE CANC 0 当下一个状态默认变为 0 时将获得 RELE。

标签: sqlsql-serverloops

解决方案


我有一个包含 3 列状态、下一个状态和默认值(0,1)的数据列表。我如何遍历数据并获得默认 = 1 的最后状态。

这是我的表的样子。

Status    Next Status    Default
--------------------------------
PASS       FAIL           0
PASS       HOLD           0
PASS       RELE           1
FAIL       EXEM           0
FAIL       HOLD           1
HOLD       RELE           0
RELE       HOLD           0
RELE       CANC           0

示例我的状态为 PASS,现在它将在表中循环并检查默认 = 1 的最后一个状态。

示例 1:通过 - RELE - 1

由于 RELE 处于下一个状态,它将查看 RELE。

RELE CANC 0 当下一个状态默认变为 0 时将获得 RELE。

我不确定我是否正确理解了要求。

这是我的理解:对于任何给定的状态,您需要弄清楚其先前的状态(如果有),默认值 = 1。而且我知道“状态”列值是给定值“下一个”的先前状态行中的“状态”列。如果我的这种理解是错误的,请纠正我。

有了这种理解,以下是 2 个查询,具体取决于您对该程序的输入:

  1. 状态是否会成为查询的输入?如果是这样:
    SELECT  DISTINCT
            S.Status
            ,LastStatus = OA.Status 
    FROM    Status S
            OUTER APPLY (
                            SELECT  TOP 1 SI.Status
                            FROM    Status SI
                            WHERE   SI.[Next Status] = S.Status
                            AND     SI.Default = 1
                        ) OA
    WHERE   S.Status = '<input status name>';
    
    2> 如果您需要为表的状态列中可用的每个状态检索此信息,则:
    SELECT  DISTINCT
            S.Status
            ,LastStatus = OA.Status 
    FROM    Status S
            OUTER APPLY (
                            SELECT  TOP 1 SI.Status
                            FROM    Status SI
                            WHERE   SI.[Next Status] = S.Status
                            AND     SI.Default = 1
                        ) OA;
    

推荐阅读