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
)
要继续您当前的方法,我们可以使用 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;
我有一个数据集,我正在尝试删除符合以下条件的记录:
如果一个 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
)
要继续您当前的方法,我们可以使用 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;