我有一个审批系统,列是name, manager, traveldate, purpose, approved
。如果姓名、经理、出差日期和用途与表中的另一条记录相同,我需要查找并删除除一条之外的所有重复项,而不删除任何可能已批准的记录
例如,当3个具有匹配的姓名、经理、旅行日期和目的且未被批准时,2应被删除;但当4个具有匹配的姓名、经理、旅行日期和目的但2已被批准时,则仅应删除未批准的2个
发布于 2019-12-02 19:32:57
我认为你想要:
with cte as (
select sum(case when approved <> 0 then 1 else 0 end) over (partition by name, manager, traveldate, purpose) as cnt_approved,
row_number() over over (partition by name, manager, traveldate, purpose, approved order by approved
) as seqnum
t.*
from mytable t
)
delete from cte
where approved = 0 and
((cnt_approved > 0 or
(cnt_approved = 0 and seqnum > 1)
);
发布于 2019-12-02 18:41:33
为了能够以一致的方式解决这个问题,最好有一个列可以用来消除(排序)具有相同(name, manager, traveldate, purpose)
的记录的歧义。假设这样的列存在,并且名为id
,您可以按照以下步骤进行操作:
with cte as (
select row_number()
over(partition by name, manager, traveldate, purpose order by id) rn
from mytable
where approved = 0
)
delete from cte where rn > 1
这将删除具有相同(name, manager, traveldate, purpose)
和具有approved = 0
的记录,同时保留具有最小id
的记录。
如果您没有这样的列,那么您只能通过使用newid()
进行排序,为每个组保留一个随机记录:
with cte as (
select row_number()
over(partition by name, manager, traveldate, purpose order by newid()) rn
from mytable
where approved = 0
)
delete from cte where rn > 1
https://stackoverflow.com/questions/59136944
复制相似问题