Tôi nghĩ rằng logic của bạn bằng cách sử dụng merge
và row_number()
đang đi đúng hướng (mặc dù, có lẽ là phân vùng partition by
mệnh đề không cần thiết, vì bạn đang lọc thành phố` rồi). Tôi đã mở rộng nó với logic bổ sung để xử lý ngày tháng:
-
effective_dt_from
ban đầu và cuối cùngeffective_dt_to
nên được để nguyên -
ở giữa, bạn muốn tăng ngày từng ngày bắt đầu từ
'2017-01-01'
.
Truy vấn:
merge into test t
using (
select
t.*,
row_number() over(order by loc_sid asc) rn,
count(*) over() cnt
from test t
where city = 'Chicago'
) t1
on (t1.loc_sid = t.loc_id)
when matched the update set
t.version = t1.rn,
t.effective_dt_from =
case
when rn = 1 then t.effective_dt_from
else date '2017-01-01' + rn - 2
end,
t.effective_dt_to =
case
when rn = cnt then t.effective_dt_to
else date '2017-01-01' + rn - 1
end