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
不能是1
和BanReason
,而不能是value1
,value2
,value3
。我应该把它们放在哪里?
Post Scriptum。如果我需要此ID的所有行,该怎么办?
3 | passive |
3 | active |
3 | passive |
答案 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
不是value1
,value2
或value3
如果这些条件中的任何一个失败,对于任何记录,那么它将被计算在内。