2014-10-20 89 views
0

我想刪除重複例如我想刪除此行「Test2,321,0」,因爲有重複,但在行1和2我只想刪除行兩個,因爲類型id高於第一行中的當前副本。刪除重複的記錄只在條件在sql服務器

這是我的表

 
ID, Name, RecordNum, Type 
-------------------------- 
1, Test, 123, 0 
2, Test, 123, 1 
3, Test2, 321, 0 
4, Test2, 321, 0 

我可以用這個查詢第4行中刪除重複。但我似乎無法弄清楚如何刪除第2行,因爲第1行是相同的,但類型號碼較低。如果類型編號爲2,則勝出,並且必須刪除具有相同名稱和記錄編號的0和1類型編號的重複項。

WITH dup2 as ( 
    SELECT Name 
     , RecordNum 
     , Type ROW_NUMBER() OVER(PARTITION BY Name, RecordNum, Type ORDER BY ID ASC) AS NumOfDups 
    FROM MyTbale) 
    delete FROM dup2 WHERE NumOfDups > 1 
+1

我假設您的查詢,如上所述,已被複制不正確? – Ben 2014-10-20 20:27:19

+0

是否要刪除第2行和第4行? – acfrancis 2014-10-20 20:28:14

回答

3

所以基本上你只想爲每個Name, RecordNum組保留一條記錄。如果類型是一樣的,只保留最低ID,如果類型是不同的保持最低的類型:

WITH dup2 AS 
( 
     SELECT NAME, 
       RecordNum, 
       NumOfDups = ROW_NUMBER()OVER(
           PARTITION BY NAME, RecordNum 
           ORDER BY CASE WHEN Type=2 THEN 0 ELSE 1 END, Type, Id) 
     FROM MyTbale) 
DELETE 
FROM dup2 
WHERE NumOfDups > 1 

SQL-Fiddle Demo

編輯根據評論:「讓說,當類型= 2那麼我想刪除其他類型爲零或一個的匹配記錄,所以這裏有兩個勝利。「

+0

嗨工作完美,除了一個人認爲我錯過了,對不起深夜。假設當類型= 2時,我想刪除其他類型爲零或一個的匹配記錄,所以這裏有兩個勝利。 – Etienne 2014-10-21 05:23:28

+0

@Etienne:然後使用'CASE'。我編輯了答案和小提琴。 – 2014-10-21 06:48:05