【问题标题】:Remove duplicate fields from a temp table that has no primary key [duplicate]从没有主键的临时表中删除重复字段 [重复]
【发布时间】:2013-04-01 01:11:39
【问题描述】:

我需要从临时表中删除重复字段,其中相关字段不完全相同。

例如,我有以下数据:

First  Last     DOB
John   Johnson  10.01.02
Steve  Stephens 23.03.02
John   Johnson  2.02.99
Dave   Davies   3.03.03

这里有两个 John Johnson 的。我只想要一个约翰约翰逊——我不在乎哪一个。所以结果表看起来像:

First  Last     DOB
John   Johnson  10.01.02
Steve  Stephens 23.03.02
Dave   Davies   3.03.03

我正在使用 TSQL,但我更喜欢使用非专有的 SQL。

谢谢

【问题讨论】:

    标签: sql sql-server tsql sql-delete


    【解决方案1】:

    Sql Server 支持Common Table ExpressionWindow Functions。使用 ROW_NUMBER() 为每个组提供排名编号,您可以过滤掉排名大于 1 的记录(这是重复的一个

    WITH records
    AS
    (
        SELECT  [First], [Last], DOB,
                ROW_NUMBER() OVER (PARTITION BY [First], [Last] ORDER BY DOB) rn
        FROM    TableName
    )
    DELETE FROM records WHERE rn > 1
    

    【讨论】:

      【解决方案2】:

      您可以将CTEROW_NUMBER 一起使用:

      WITH CTE AS
      (
         SELECT RN = ROW_NUMBER() OVER (PARTITION BY First, Last ORDER BY First,  Last)
         FROM TempTable
      )
      DELETE CTE 
      WHERE RN > 1;
      

      DEMO

      【讨论】:

        【解决方案3】:

        好吧,我迟到了,但这里有一个与数据库无关的解决方案:

        SELECT A.*
        FROM YourTable A
        INNER JOIN (SELECT [First], [Last], MAX(DOB) MaxDob
                    FROM YourTable
                    GROUP BY [First], [Last]) B
            ON A.[First] = B.[First] 
            AND A.[Last] = B.[Last]
            AND A.DOB = B.MaxDob
        

        And here is a sqlfiddle 有一个演示。 (感谢@JW 提供小提琴的架构)

        【讨论】:

          【解决方案4】:

          您可以使用CTEROW_NUMBER() 来完成此操作:

          WITH CTE
          AS
          (
              SELECT 
                 First, 
                 Last, 
                 DOB,
                 ROW_NUMBER() OVER (PARTITION BY First, Last ORDER BY DOB) RN
              FROM  
                 Table1
          )
          
          DELETE FROM CTE WHERE RN > 1
          

          SQL FIDDLE DEMO

          【讨论】:

            猜你喜欢
            • 2010-11-02
            • 1970-01-01
            • 1970-01-01
            • 2017-03-14
            • 1970-01-01
            • 2015-06-07
            • 2018-11-05
            • 1970-01-01
            相关资源
            最近更新 更多