dyn*_*obo 1 sql sql-server sql-server-2008
我有这样一张桌子:
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
Run Code Online (Sandbox Code Playgroud)
我想识别每条记录,其中LocationAND 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
Run Code Online (Sandbox Code Playgroud)
由于表格很长,解决方案应该很快.:-)
谢谢你的每一个提示!
干杯,霍尔格
一种方法是使用CTE(公用表表达式),如果您使用的是SQL Server 2005及更高版本(在这方面您不够具体).
使用此CTE,您可以按照某些条件(即您的(Location, EMail)- )对数据进行分区,并为每个"分区"的所有行启用SQL Server编号,按降序排序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
Run Code Online (Sandbox Code Playgroud)
在这里,我只为每个"分区"(即每个(Location, EMail)元组)选择"第一个"(最新)条目- 按CreationTime降序排序.
因此,对于每一个最新的项目(Location, EMail)元组具有的价值1为它的RowNum任何"重复"必须大于值1 -所以我删除了所有这些"复制" -就大功告成了!