我有一张这样的表:
Location E-Mail Name Language Creation Time
-----------------------------------------------------------------------
D max@gmx.net Max de 19:06:00 <-- A
D peter@outlook.com Peter en 19:10:00
D lisa@google.com Lisa en 17:39:00
E tom@hotmail.com Tom fr 05:00:00 <-- B
E carl@gmx.net Carl en 09:01:00
D max@gmx.net Max en 17:45:00 <-- A
D max@gmx.net Mike de 17:45:00 <-- A
E tom@hotmail.com Tom de 06:00:00 <-- B
我想识别Location
和E-Mail
相同的每条记录,删除“重复”并保留最新记录。如果创建时间相同(A),则无关紧要,删除哪条记录。
结果表应为:
Location E-Mail Name Language Creation Time
-----------------------------------------------------------------------
D peter@outlook.com Peter en 19:10:00
D lisa@google.com Lisa en 17:39:00
E tom@hotmail.com Tom fr 05:00:00 <-- B
E carl@gmx.net Carl en 09:01:00
D max@gmx.net Mike de 17:45:00 <-- A
由于表格很长,解决方案应该很快。 : - )
感谢您的每一个提示!
干杯,霍尔格
答案 0 :(得分:6)
如果你使用的是SQL Server 2005及更新版本(在这方面你不够具体),一种方法是使用CTE(公用表表达式)。
使用此CTE,您可以按照某些条件对数据进行分区 - 即(Location, EMail)
- 并为每个“分区”提供从1开始的所有行的SQL Server编号,按降序排列{{1 }}
所以尝试这样的事情:
CreationTime
在这里,我只为每个“分区”(即每个;WITH NewestData AS
(
SELECT
Location, EMail, Name, Language, CreationTime,
RowNum = ROW_NUMBER() OVER(PARTITION BY Location, EMail
ORDER BY CreationTime DESC)
FROM
dbo.YourTableNameHere
)
DELETE FROM NewestData
WHERE RowNum > 1
元组)选择“第一个”(最新)条目 - 由(Location, EMail)
按降序排序。
因此,每个CreationTime
元组的最新条目的(Location, EMail)
值为1
,任何“重复”的值都大于RowNum
- 所以我只是删除远离所有那些“重复” - 你已经完成了!