首页 > 解决方案 > 在 SQL 中查找发生变化的行,但仅保留某些更改,同时保留其他更改

问题描述

我有这种情况,我希望每次出现的活动行都在我的结果集中恢复该行,并且如果该 IDENTIFIER 只有 1 个不活动记录并且如果有超过 1 个活动记录也显示这些记录。我使用了 Row_Number 函数,然后在另一个查询中显示 row = '1' 但如果我这样做,第 1 行只会回来,然后我会丢失一些我想要的结果。重申我的问题是我希望所有活动记录都回来,并且只有在 IDENTIFIER 唯一的情况下才处于非活动状态。粗体的行不应显示在结果中。 1 在数据库中有 1 条活动记录。
2 有 2 条活动记录和 1 条非活动记录。
3 没有活动记录。
4 只有 2 条活动记录,没有非活动记录。

在此处输入图像描述

在此处输入图像描述

标签: sqlsql-server

解决方案


您可以使用窗口条件计数,这样做的好处是只扫描表一次

SELECT
    t.IDENTIFIER,
    t.DB_ID,
    t.Status
FROM (
    SELECT *,
        HasActive = COUNT(CASE WHEN t.Status = 'Active' THEN 1 END) OVER (PARTITION BY t.IDENTIFIER)
    FROM YourTable t
) t
WHERE t.Status = 'Active' OR t.HasActive = 0;

推荐阅读