返回每个ID出现多次列值的行

时间:2017-05-16 07:04:22

标签: sql-server select count common-table-expression

dB:SQL Server 2014

对于每个STATUS = 'Passive'

,我需要ID两次或更多次的行

表:

Id  |   Status  |
----|-----------|
1   |   unknown |
1   |   other   |
1   |   active  |

2   |   unknown |
2   |   other   |
2   |   passive |

3   |   passive |
3   |   active  |
3   |   passive |

结果:

3   |   passive |
3   |   passive |

TRIED:

;WITH Z AS
(
SELECT *, 
       COUNT(*) OVER (PARTITION BY Id) as Cnt
FROM TheTable
)
SELECT ID, Status
FROM Z
WHERE Cnt >= 2
AND Status = 'Passive'

上面的查询似乎有效,我想确保它100%正确工作。 任何评论?

我还需要更多条件用于另一个记录集。我的列Banned不能是1BanReason,而不能是value1value2value3。我应该把它们放在哪里?

Post Scriptum。如果我需要此ID的所有行,该怎么办?

3   |   passive |
3   |   active  |
3   |   passive |

1 个答案:

答案 0 :(得分:2)

您当前查询的结构已经可以返回表中的每条记录。您可以使用带SUM()的条件聚合作为窗口函数。

;WITH Z AS
(
    SELECT *, 
        SUM(CASE WHEN Status = 'Passive' AND
                      Banned <> 1 AND
                      BanReason NOT IN ('value1', 'value2', 'value3') THEN 1 ELSE 0 END)
        OVER (PARTITION BY ID) AS Cnt
    FROM TheTable
)
SELECT ID, Status
FROM Z
WHERE Cnt >= 2

我的更新答案现在只有在满足以下条件时才会计算角色:

  • 状态为Passive
  • Banned字段不是1
  • BanReason不是value1value2value3

如果这些条件中的任何一个失败,对于任何记录,那么它将被计算在内。