【问题标题】:How to write a SQL script that deletes duplicate posts如何编写删除重复帖子的 SQL 脚本
【发布时间】:2018-03-17 11:43:45
【问题描述】:

我有一个包含这些列的表格:

id (pk, int identity), imei (varchar), name (varchar), lastconnected (datetime)

此表中的某些条目具有相同的名称和imei,但不同的id 和不同的lastconnected 日期。

如何有效地过滤掉所有重复的条目(使用 SQL 脚本),然后删除具有最新 lastconnected 日期的条目?

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。
  • 当有 3 行(或更多)具有相同 imei 和名称的行时会发生什么?您仍想只删除其中一行并保留其他重复行吗?
  • 使用sql server
  • 是的,有一些有 3 个相同的行。然后我想删除 3 个中的 2 个。最后一个连接日期不会被删除的那个

标签: sql-server database tsql ssms


【解决方案1】:

一个简单的ROW_NUMBERDELETE 就可以解决问题:

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY imei, [name] ORDER BY lastconnected DESC)
    FROM dbo.YourTable
)
DELETE FROM CTE
WHERE RN = 1;

【讨论】:

    【解决方案2】:

    这很简单,会解决你的问题

    DECLARE @table TABLE
    (
     id int, 
     name varchar(10),
     imei varchar(10)
    )
    insert into @table select 1, 'a','a' 
    insert into @table select 2, 'b','a' 
    insert into @table select 3, 'c','a' 
    insert into @table select 4, 'a','a' 
    insert into @table select 5, 'c','a' 
    insert into @table select 6, 'a','a' 
    insert into @table select 7, 'c','a' 
    insert into @table select 8, 'a','a' 
    
    WHILE (exists (select '' from @table group by name , imei having count(*) > 1))  
    BEGIN  
     delete from @table where id  in (
     select max(id)  from @table group by imei , name having count(*) > 1)   
    End 
    
    select * from @table
    

    【讨论】:

      【解决方案3】:

      我的第一反应是使用RANK()。这将删除所有重复项,而不仅仅是最近的,以防重复多次。

          delete a
          from (
              select id, imei, name, lastconnected, RANK() over(partition by imei, name order by lastconnected) as [rank] from #temp
          ) as a
          where a.rank>1
      

      【讨论】:

        【解决方案4】:

        它为 name 和 iemi 的每个组合选择日期的最大值,然后删除该特定行。

        DELETE FROM yourtablee
        WHERE (lastconnecteddate,name,imei) in 
                          (SELECT max(lastconnecteddate), name,imei
                             FROM yourtable
                         GROUP BY name,imei)
        

        【讨论】:

          猜你喜欢
          • 2020-08-30
          • 2023-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-04
          • 2011-09-24
          相关资源
          最近更新 更多