比较SQL Server表中的两个记录并删除不需要的记录

时间:2017-11-18 16:10:59

标签: sql sql-server tsql

我在表格中有这些数据:

UID         Date       Codes   Ratecell
---------------------------------------
11111111    01/01/17    021    A111
11111111    01/01/17    024    A111
22222222    01/01/17    021    A112
22222222    01/01/17    024    A111
33333333    01/01/18    001    A112
33333333    01/01/18    021    A112

我的问题是:如果UID上匹配并且相同日期但代码不同的同一UID的费率单位相同,则删除代码为024的记录。如何编写或加入查询以实现此目的?

2 个答案:

答案 0 :(得分:1)

我正在考虑窗口功能:

select t.*
from (select t.*,
             min(ratecell) over (partition by uid, date, code) as min_ratecell,
             max(ratecell) over (partition by uid, date, code) as max_ratecell
      from t
     ) t
where not (min_ratecell <> max_ratecell and ratecell = 'A112');

如果您愿意,可以轻松将其转换为实际delete

答案 1 :(得分:0)

公用表表达式(CTE)对任务非常有用。见例。

declare @tbl table(UID int, [Date] Date, Codes varchar(10), Ratecell varchar(10))
insert @tbl values
(11111111,    '01/01/17',    '021',    'A111'),
(11111111,    '01/01/17',    '024',    'A111'),
(22222222,    '01/01/17',    '021',    'A112'),
(22222222,    '01/01/17',    '024',    'A111'),
(33333333,    '01/01/18',    '001',    'A112'),
(33333333,    '01/01/18',    '021',    'A112')

;with cte as (
select *,
ROW_NUMBER() over (partition by uid,[date],ratecell order by codes) rn
from @tbl
)
--select * from cte -- uncomment for test
delete cte --comment for test
where rn > 1

select * from @tbl t