【问题标题】:How to delete duplicate in the below scenario using SQL如何使用 SQL 在以下场景中删除重复项
【发布时间】:2019-02-27 17:55:06
【问题描述】:

如何删除重复。这里我只想保留不同的记录(记录)

ID          LAST_MODIFIED_DATE      rn
44849691    2019-01-29 00:00:09.000 1
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2
44849691    2019-01-29 00:31:30.000 2

使用RANK 分区函数

【问题讨论】:

  • 你试过什么?签入 Row_Number 并按分区划分
  • 你的数据结构是什么?我猜你已经有了rn,你已经在使用某种窗口函数了。只需调整它,使您要保留的记录为rn=1,然后删除其余记录。
  • 如果您想删除所有重复记录,只需将您的RANK...OVER... 更改为ROW_NUMBER() OVER....。然后删除任何不是 1 的内容。

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

使用ROW_NUMBER() 窗口函数代替RANK()。在 CTE 中查询,然后从 CTE 中简单地 DELETE 记录。这将回到您的实际表中。

; WITH cte1 AS (
    SELECT ROW_NUMBER() OVER ( PARTITION BY ID, LAST_MODIFIED_DATE ORDER BY ( SELECT NULL ) ) AS rn
    FROM t1 
) 
DELETE FROM cte1 WHERE rn > 1 ;

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=0b1e4bba4577837cf7c9cedbd26e3e36

请记住,如果您删除了大量记录,您的日志将显着增加,您将需要重建您拥有的所有索引。

如果您的空间有限,那么 Gordon 选择新表的答案将是最好的。这真的取决于桌子的其余部分是什么样子。

我们正在处理多少行?数据上是否有任何索引?

编辑说明:我将 ROW_NUMBER() 函数更改为 ORDER BY ( SELECT NULL ),而不是实际字段。在这种情况下,我们似乎并不关心顺序是什么,因为我们正在寻找重复项。

编辑 2:

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=1f3eb371dbe1cfa84291e5aaa566cc76

该链接演示了有一个额外的列,这将阻止我们真正重复的行。但是我们仍然可以删除基于IDLAST_MODIFIED_DATE 的记录。但是,请注意,除非您在 ORDER BY .... 中指定另一个字段,否则被视为“重复”的行会有些随意。

【讨论】:

    【解决方案2】:

    你有很多重复。只创建一个新表怎么样?

    select distinct t.*
    into distinct_t
    from t;
    

    然后您可以根据需要重新插入数据:

    truncate table t;
    
    insert into t
        select * from distinct_t;
    

    【讨论】:

    • 谢谢。有什么方法可以使用Rank分区函数
    • @user1254579 不像你目前使用的RANK()
    • @user1254579 。 . .在一张大桌子上,这可能效率更高。
    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多