首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server :删除4列匹配的重复项,但将具有特定值的重复项保留在另一列中

SQL Server :删除4列匹配的重复项,但将具有特定值的重复项保留在另一列中
EN

Stack Overflow用户
提问于 2019-12-02 18:27:08
回答 2查看 36关注 0票数 0

我有一个审批系统,列是name, manager, traveldate, purpose, approved。如果姓名、经理、出差日期和用途与表中的另一条记录相同,我需要查找并删除除一条之外的所有重复项,而不删除任何可能已批准的记录

例如,当3个具有匹配的姓名、经理、旅行日期和目的且未被批准时,2应被删除;但当4个具有匹配的姓名、经理、旅行日期和目的但2已被批准时,则仅应删除未批准的2个

EN

回答 2

Stack Overflow用户

发布于 2019-12-02 19:32:57

我认为你想要:

代码语言:javascript
运行
复制
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)
          );
票数 1
EN

Stack Overflow用户

发布于 2019-12-02 18:41:33

为了能够以一致的方式解决这个问题,最好有一个列可以用来消除(排序)具有相同(name, manager, traveldate, purpose)的记录的歧义。假设这样的列存在,并且名为id,您可以按照以下步骤进行操作:

代码语言:javascript
运行
复制
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()进行排序,为每个组保留一个随机记录:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59136944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档