2014-02-28 53 views
0

我有類似表的東西之間:SQL刪除重複與較大的差別兩列

ID Value1  Value2 
122 800   1600 
122 800   1800 
133 700   1500 
154 800   1800 
133 700   1500 
188 700   1400 
176 900   1500 

從這個表我想刪除其具有值2有較大區別的重複(的122ID133)和value1。

這意味着在ID122我想保持第一行(1800-800>1600-800) 這意味着在ID133我想保持任何一個,因爲它們都具有相同的差異。

ID Value1  Value2 
122 800   1600 
122 800   1800 <------delete this row 
133 700   1500 <------delete either this row or the other identical row 
154 800   1800 
133 700   1500 <------delete either this row or the other identical row 
188 700   1400 
176 900   1500 

這是一個更大的規模,所以我不能只是單獨刪除記錄。

有沒有辦法編寫一個語句,將刪除我的表中的所有重複項,其中Value2 - Value1大於Value2 - Value1重複?

+0

您使用的數據庫是? SQL Server或MySQL。請適當地標記問題。 –

+0

你可以用存儲過程做類似的事情...我認爲這是最好的方式恕我直言 – Hackerman

+1

如果你的數據庫是MS SQL Server,你可以使用CTE。幫助我們通過用正確的數據庫標記您的問題來幫助您。 – Shiva

回答

2

SQL Server具有可更新CTE和子查詢的這一重要特性。因此,您可以這樣做:

with todelete as (
     select t.*, 
      row_number() over (partition by id order by value2 - value1) as diff_seqnum 
     from table t 
    ) 
delete from todelete 
    where diff_seqnum > 1; 

即,根據兩個值的差異枚舉每個ID的行。然後,只保留序列號爲1的行。