【发布时间】:2020-10-08 19:40:40
【问题描述】:
TABLE1
CODE RATE1 type MONTH
A 0 Acc1 201906
A 0 Acc1 201907
A 0 Acc1 201908
A 1 Acc1 201909
A 1 Acc1 201910
A 1 Acc1 201911
A 1 Acc1 201912
A 1 Acc1 202001
A 1 Acc1 202002
A 1 Acc1 202003
A 1 Acc1 202004
A 1 Acc1 202005
A 1 Acc1 202006
A 1 Acc1 202007
A 1 Acc1 202008
A 1 Acc1 202009
A 0 Acc2 201906
A 0 Acc2 201907
A 0 Acc2 201908
A 1 Acc2 201909
A 1 Acc2 201910
A 1 Acc2 201911
A 1 Acc2 201912
A 1 Acc2 202001
A 1 Acc2 202002
A 1 Acc2 202003
A 1 Acc2 202004
A 1 Acc2 202005
A 1 Acc2 202006
A 1 Acc2 202007
A 1 Acc2 202008
A 1 Acc2 202009
表2
CODE RATE2 MONTH
A 10 202001
A 10 202002
A 10 202003
A 10 202004
我正在将数据从旧系统迁移到新系统。作为每月维护的旧系统数据的一部分,如果数据更新并且表包含一个月的一行,则将更新同一行,我正在迁移到新闻系统,它包含创建活动记录的开始日期和结束日期。所以在更新新数据时需要插入和更新旧行结束日期
我有几个表需要加入并根据 rate1 和 rate2 找到开始日期和结束日期。 我的第一个表包含所有月份的数据,第二个表数据可用,直到它在 decativate 上的活动数据将不可用。如果利率可用,我们认为是 0。
我的预期输出
CODE RATE1 RATE2 Type START_DT END_DT
A 0 0 Acc1 201906 201908
A 1 0 Acc1 201909 201912
A 1 10 Acc1 202001 202004
A 1 0 Acc1 202005 202009
A 0 0 Acc2 201906 201908
A 1 0 Acc2 201909 201912
A 1 10 Acc2 202001 202004
A 1 0 Acc2 202005 202009
但我的结果低于 23 行。
select code1, rate1, rate2, type, min(month) start_dt,
case when row_number() over(partition by code1 order by max(month) desc) = 1 then 999912 else max(month) end end_dt
from (
select t1.month, code1, rate1, rate2, type,
row_number() over(partition by code1 order by t1.month) rn1,
row_number() over(partition by code1, type, rate1, rate2, type order by t1.month) rn2
from table1 t1 left join table2 t2 on t1.code1 = t2.code2 and t1.month = t2.month
) t
group by code1, rate1, rate2, type, rn1 - rn2
order by start_dt
请在此 URL https://dbfiddle.uk/?rdbms=oracle_18&fiddle=b4f77cd13967c1c5a74efcacfb3d3a22 中找到我的查询
提前致谢。
如果您需要更多信息,请发表评论
【问题讨论】:
标签: sql oracle gaps-and-islands