2014-01-08 110 views
1

我有這樣的一個表:刪除有兩個相同的列值的記錄表中​​的

Location E-Mail   Name   Language  Creation Time 
----------------------------------------------------------------------- 
D   [email protected]  Max   de   19:06:00 <-- A 
D   [email protected] Peter   en   19:10:00 
D   [email protected] Lisa   en   17:39:00 
E   [email protected] Tom   fr   05:00:00 <-- B 
E   [email protected]  Carl   en   09:01:00 
D   [email protected]  Max   en   17:45:00 <-- A 
D   [email protected]  Mike   de   17:45:00 <-- A 
E   [email protected] Tom   de   06:00:00 <-- B 

我想,以確定每一條記錄,其中LocationE-Mail是相同的,刪除了「重複」,只有保持最新的紀錄。如果創建時間相同(A),則無關緊要,哪些記錄被刪除。

結果表應該是:

Location E-Mail   Name   Language  Creation Time 
----------------------------------------------------------------------- 
D   [email protected] Peter   en   19:10:00 
D   [email protected] Lisa   en   17:39:00 
E   [email protected] Tom   fr   05:00:00 <-- B 
E   [email protected]  Carl   en   09:01:00 
D   [email protected]  Mike   de   17:45:00 <-- A 

因爲表很長,溶液應迅速。 :-)

感謝您的每一個提示!

乾杯,霍爾格

+1

你有表的主鍵嗎? – shadowjfaith

+0

@shadowjfaith:沒有主鍵。我打算在結果表中使用「位置」和「電子郵件」作爲主鍵...... – dynobo

回答

6

一種方法是,如果你是SQL Server 2005和更新上使用CTE(公共表表達式)(你是不是在這方面不夠具體)。

使用此CTE,您可以按照某些條件(即(Location, EMail))對數據進行分區,並且SQL Server編號爲1,對於每個「分區」,從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)元組IE)只選擇了「第一」(最新)爲每個「分區」項 - 下令在該CreationTime降序。

所以每個(Location, EMail)元組最新的項目有1值其RowNum,任何「重複」比1更大的價值 - 所以我刪除了所有這些「複製」 - 就大功告成了!

+0

+1得到詳細的答案 – Lamak

+1

非常感謝!使用MS SQL-Server 2008,應該沒問題!我測試它並報告回來:-) – dynobo

+0

工作得很好!再次感謝! – dynobo

相關問題