SQL window 函数删除具有不同条件的多个值

SQL window function to remove multiple values with different criteria

我有一个数据集,我正在尝试删除符合以下条件的记录:

如果一个 practid 有多个具有相同日期的记录,并且至少一个记录的原因是 "L&B" 那么我希望删除该日期的所有 practid。

DECLARE t table(practid int, statusdate date, reason varchar(100)

INSERT INTO t VALUES (1, '2018-03-01', 'L&B'),
                     (1, '2018-03-01', 'NULL'),
                     (1, '2018-04-01, 'R&D'),
                     (2, '2018-05-01, 'R&D'),
                     (2, '2018-05-01, 'R&D'),
                     (2, '2018-03-15', NULL),
                     (2, '2018-03-15', 'R&D),
                     (3, '2018-07-01, 'L&B)

使用这个数据集,我想要以下结果:

PractId  StatusDate   Reason
1         2018-04-01   R&D
2         2018-05-01   R&D
2         2018-05-01   R&D
2         2018-03-15    NULL
2         2018-03-15   R&D

我尝试使用 window 函数解决此问题,但卡住了:

SELECT *, ROW_NUMBER() OVER
    (PARTITION BY practid, statusdate, CASE WHEN reason = 'L&B' THEN 0 ELSE 1 END) AS rn
FROM table

根据我的查询,我不知道如何保持 Practid = 2,因为我想保留所有记录。

您可以尝试将 not exists 与子查询一起使用。

 Select *
 from t t1
 where not exists (
     select 1 
     from t tt
     where tt.reason = 'L&B' and t1.statusdate = tt.statusdate
 )

sqlfiddle

要继续您当前的方法,我们可以使用 COUNT 作为分析函数。我们可以计算 L&B 原因在每个 practid/statusdate window 上的出现次数,然后仅保留该原因从未出现的组。

SELECT practid, statusdate, reason
FROM
(
    SELECT *,
        COUNT(CASE WHEN reason = 'L&B' THEN 1 END) OVER
            (PARTITION BY practid, statusdate) cnt
    FROM yourTable
) t
WHERE cnt = 0;

Demo