我应该在SQL Server中对此类数据使用哪个循环?

时间:2019-06-13 03:55:36

标签: sql sql-server loops

我有一个包含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

示例我的StatusPASS,现在它将在表中循环并检查默认状态为1的最后状态是什么。

Samle1:通过-RELE-1

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

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

1 个答案:

答案 0 :(得分:0)

  

我有一个包含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的最后状态是什么。

     

Samle1:通过-RELE-1

     

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

     

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

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

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

基于这种理解,以下是两个查询,具体取决于您对该程序的输入是什么:

  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;