我需要从临时表中删除重复字段,其中有问题的字段不完全相同。
例如,我有以下数据:
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。
由于
答案 0 :(得分:6)
Sql Server支持Common Table Expression
和Window 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;
答案 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