我的桌子类似于:
ID Value1 Value2
122 800 1600
122 800 1800
133 700 1500
154 800 1800
133 700 1500
188 700 1400
176 900 1500
从此表中,我想删除重复项(ID
和122
的重复项),它们在value2和value1之间有较大的差异。
这意味着133
ID
的位置我要保留第一行(122
)
这意味着1800-800>1600-800
ID
133
我希望保留其中任何一个,因为它们都有相同的差异。
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 :(得分: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
的行。