首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请求提供查询以删除重复记录

请求提供查询以删除重复记录
EN

Stack Overflow用户
提问于 2020-07-14 07:52:02
回答 3查看 41关注 0票数 0

案例-1

如果所有记录都处于该特定Ref_No的异常状态,则为

删除除第一记录外的所有记录

案例-2

如果某些记录处于异常状态,而对于特定的Ref_No有一条处于匹配状态

删除所有状态异常的记录

下面的查询对于Case-2很好,但不适用于Case-1。请求某人帮助进行查询。

代码语言:javascript
复制
with cte
       as (
       select ROW_NUMBER() over (partition by Ref_No order by Id) RN ,* from 
      Table1
       )
                     
 Delete from cte where Final_status <> 'MATCHED'

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-14 07:59:31

如果“异常”和“匹配”是最终状态的唯一选项,那么您可以在ORDER BY Final_Status DESC中使用row_number。然后添加一个WHERE条件,使其永不删除RN=1

代码语言:javascript
复制
with cte
       as (
       select ROW_NUMBER() over (partition by Ref_No order by Final_Status DESC, Id) RN ,* from 
      Table1
       )
                     
Delete from cte 
where Final_status <> 'MATCHED'
AND RN>1
票数 1
EN

Stack Overflow用户

发布于 2020-07-14 08:09:15

这样就不需要假设只有两种最终状态:

代码语言:javascript
复制
delete from T
where exists (
    select 1 from T t2
    where t2.Ref_No = T.Ref_No and t2.Id <> T.Id and (
            -- if it's not matched and there's another row that is
            T.Final_status <> 'Matched' and t2.Final_status = 'Matched'
            -- it's not the first row that's non-matched 
        or  T.Id > t2.Id and not 'Matched' in (T.Final_status, t2.Final_status)
    );

您仍然可以使用case表达式将匹配的vs非匹配折叠为两种可排序状态。这个查询更便于移植,并且不依赖于从表表达式中删除的想法。

票数 1
EN

Stack Overflow用户

发布于 2020-07-14 08:46:35

我们可以通过DESC的订单,使匹配的状态出现在顶部,如果有。如果没有匹配的状态,那么异常状态将出现在顶部。

这样,我们只保留等级1,然后删除重复的。

代码语言:javascript
复制
;WITH CTE AS
(
SELECT ID,Ref_No, ROW_NUMBER() OVER(PARTITION BY Ref_No ORDER BY Final_Status DESC) AS rnk , Final_Status
FROM Table
)
DELETE FROM CTE
WHERE rnk > 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62890430

复制
相关文章

相似问题

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