我在表格中有这些数据:
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的记录。如何编写或加入查询以实现此目的?
答案 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