SSIS / SQL Server - 基于多个条件列的标记

时间:2016-11-08 15:30:11

标签: sql sql-server tsql ssis

我有以下表格:

 ID | Number | Condition 1 | Condition 2 | Condition 3 | Condition 4 
 1  | 1      | 1           | 2           | 1           | 1
 1  | 2      | 2           | 1           | 2           | 2
 2  | 5      | 2           | 2           | 2           | 1
 2  | 6      | 2           | 2           | 2           | 2
 3  | 7      | 1           | 1           | 2           | 1
 3  | 8      | 2           | 1           | 1           | 2
 3  | 3      | 2           | 1           | 2           | 2
 4  | 9      | 2           | 1           | 1           | 1
 4  | 4      | 1           | 1           | 1           | 2
 5  | 10     | 2           | 1           | 2           | 1
 5  | 13     | 2           | 1           | 2           | 2

(相当混乱,抱歉)

如您所见,有多个ID。我必须根据条件取一个ID。所以,我想逐个检查每个条件,并根据输出结果添加一列。这背后的逻辑是

  

如果(对于每组ID')一行condition = 1,那么这是正确的一行。如果两行都是1或两者都是2,那么我们检查以下条件。

因此,如果我们仅采用ID 1的记录,我们可以看到ID 1 - Number 1是我们输出中所需的正确记录。

但是如果我们采用ID 2,我们会发现两个记录都具有相同的值,但我们没有给出答案。在这种情况下,我们会查看condition 2并在那里实现相同的逻辑。

condition 4对于每个ID,总是会有一个记录为' 1'

所以我的输出是:

 ID | Number | Condition 1 | Condition 2 | Condition 3 | Condition 4 | IsOk
 1  | 1      | 1           | 2           | 1           | 1           | 1
 1  | 2      | 2           | 1           | 2           | 2           | 2
 2  | 5      | 2           | 2           | 2           | 1           | 1
 2  | 6      | 2           | 2           | 2           | 2           | 2
 3  | 7      | 1           | 1           | 2           | 1           | 1
 3  | 8      | 2           | 1           | 1           | 2           | 2
 3  | 3      | 2           | 1           | 2           | 2           | 2
 4  | 9      | 2           | 1           | 1           | 1           | 2
 4  | 4      | 1           | 1           | 1           | 2           | 1
 5  | 10     | 2           | 1           | 2           | 1           | 1
 5  | 13     | 2           | 1           | 2           | 2           | 2

有任何建议/意见吗?

我将在SSIS中使用它,因此SSIS中的解决方案或纯SQL代码对我来说都没问题。

如果有人想知道:我用Case

尝试了
  ,CASE
   when [Condition1] = 1 then 1
    else CASE when [Condition2] = 1 then 1 
     else   CASE when [Condition3] = 1 then 1 
        else        CASE when [Condition4] = 1 then 1 END
        END
        END
   END AS IsOk

但是没有提供所要求的结果

1 个答案:

答案 0 :(得分:2)

这可以通过自引用派生表来实现。基本上,您检查每一行是否独立“确定”然后将该数据集连接到自身以检查前一行是否已被视为“确定”,在这种情况下将其标记为“不正常”。这是有效的,因为您的条件始终为12,因此在创建row_number时,您可以优先订购Condition,并保证“第一”行为“确定”将具有优先row_number即:对于同一{{1},您将不会返回任何“Ok”行的行,其中row_number行高于“Not Ok”行}}:

ID