从没有主键的临时表中删除重复字段 [重复]
Posted
技术标签:
【中文标题】从没有主键的临时表中删除重复字段 [重复]【英文标题】: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。
谢谢
【问题讨论】:
【参考方案1】: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
SQLFiddle Demo
TSQL Ranking Functions
【讨论】:
【参考方案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
【讨论】:
【参考方案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】:您可以使用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
【讨论】:
以上是关于从没有主键的临时表中删除重复字段 [重复]的主要内容,如果未能解决你的问题,请参考以下文章