当前位置: 首页 > 面试题库 >

SQL查询-如果重复3次以上,则删除重复项?

澹台啸
2023-03-14
问题内容

没有人有一个优雅的sql语句来删除表中的重复记录,但前提是重复项的数量多于x个?因此,最多允许2或3个重复项,仅此而已?

当前,我有一条执行以下操作的select语句:

delete table
from table t
left outer join (
 select max(id) as rowid, dupcol1, dupcol2
 from table
 group by dupcol1, dupcol2
) as keeprows on t.id=keeprows.rowid
where keeprows.rowid is null

这很好用。但是现在,我只想删除那些重复超过2个的行。

谢谢


问题答案:

with cte as (
select row_number() over (partition by dupcol1, dupcol2 order by ID) as rn
from table)
delete from cte
where rn > 2; – or >3 etc


该查询正在为每个记录制造一个“行号”,并按(dupcol1,dupcol2)分组并按ID排序。实际上,该行号对具有相同dupcol1和dupcol2的“重复项”进行计数,然后按ID顺序分配数字1、2、3..N。如果您只想保留2个“重复项”,则需要删除已分配了数字的重复项3,4,.. N,这就是DELLETE.. WHERE rn > 2;

使用此方法,您可以更改,ORDER BY使其适合您的首选顺序(例如ORDER BY ID DESC),这样LATESThas
rn=1,然后倒数第二个为rn = 2,依此类推。其余的保持不变,DELETE它将删除最旧的那些,因为它们具有最高的行号。

与这个紧密相关的问题)不同,随着条件变得越来越复杂,使用CTE和row_number()变得更加简单。如果没有正确的访问索引,性能仍然可能会出现问题。



 类似资料:
  • 当我要执行以下查询时: 我得到了错误: 消息102,级别15,状态1,第1行“,”附近的语法不正确。 编辑: 我要删除klantId 3。

  • 问题内容: 我需要从下表中删除半重复记录 对于存在的任何重复PID,我想删除最低得分记录。在上面的示例中,将删除ID 1。我试图提出一种不使用循环的方法,但确实很挣扎。 任何帮助,将不胜感激。 谢谢 问题答案:

  • 问题内容: 如何从以以下方式设置的表中删除重复项? 一个工作人员可以有多个与他们相关联的type_ID,我想删除所有重复的类型。如果有重复项,我想删除具有最新条目的类型。 问题答案: 窗口函数row_number()的教科书候选: 这也照顾了一组相同的受骗者的情况。 请参阅有关data.SE的简化演示。 更新较简单的版本 事实证明,这可以简化:在SQL Server中,您可以直接从CTE中删除:

  • 我有下表(TBL_视频),在“TIMESTAMP”中有重复的列条目,我只想在“CAMERA”编号匹配时删除它们。 之前: 之后: 我已尝试此语句,但列不会相应删除。我非常感谢为生成正确的SQL语句所提供的所有帮助。提前谢谢!

  • 问题内容: 我有一张桌子,如下所示: 我想基于3个字段emp_name,emp_address和sex删除重复的条目。和我的结果表(删除重复项后)应类似于- 我不记得如何为此编写SQL查询。任何人都可以帮忙吗? 问题答案: 看起来所有四个列值都是重复的,因此您可以执行以下操作- 但是,如果婚姻状况可能有所不同,并且您还有其他根据其选择的列(例如,您希望基于create_date列作为最新记录),则

  • 除了以下方法之外,是否有其他方法仅在给定键存在的情况下删除字典中的项: 在这种情况下,我得到了一组要从给定的字典中删除的键,但我不确定这些键是否都存在于字典中。以防我错过更有效的解决方案。