从没有主键的临时表中删除重复的字段

时间:2013-04-09 14:32:17

标签: sql sql-server tsql sql-delete

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

例如,我有以下数据:

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's。我只想要一个约翰逊 - 我不在乎哪一个。所以结果表看起来像:

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

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

由于

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

您可以CTE使用ROW_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

答案 2 :(得分:1)

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

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提供小提琴的架构)

答案 3 :(得分:0)

您可以CTE使用ROW_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