【问题标题】:Return rows where a column value appears more than once for each ID返回每个 ID 的列值出现多次的行
【发布时间】:2017-05-16 07:04:21
【问题描述】:

分贝: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 |

尝试过:

;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。我应该把这些放在哪里?


后脚本。如果我需要此 ID 的所有行怎么办?

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

【问题讨论】:

  • 对于ID=3status='passive' 只出现两次。无论status如何,您都选择出现3次的记录。

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


【解决方案1】:

当前查询的结构已经使得它可能返回表中的每条记录。您可以将条件聚合与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

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

【讨论】:

  • 这似乎有效。但是,我纠正了这个问题。我查询的最后一行必须是:AND Status = 'Passive'
  • 我刚刚意识到我需要更多条件。我有一列 Banned 不能是 1BanReason 不能是 value1value2value3。我应该把这些放在哪里?
  • 所以您想计算状态为PassiveBanned 不是1BanReason 不是这三个值中的任何一个的记录?对吗?
  • 没错。而Passive 仍然出现 2 次或更多次
  • 你没有完全回答我的问题。您是否在所有这些新条件都为真并且状态为Passive 或其他情况时才算一行?
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多