12

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

例如,我有以下数据:

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

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

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

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

谢谢

4

4 回答 4

7

Sql Server 支持Common Table ExpressionWindow Functions. 使用ROW_NUMBER()which 为每个组提供排名编号,您可以过滤掉排名大于 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
于 2013-04-09T14:34:08.643 回答
3

您可以使用CTEwith 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;

演示

于 2013-04-09T14:39:01.330 回答
2

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

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

这是一个带有演示的sqlfiddle。(感谢@JW 提供小提琴的架构)

于 2013-04-09T15:07:01.443 回答
0

您可以使用CTEwithROW_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 小提琴演示

于 2013-04-09T14:37:02.443 回答