请教下,像这个发生日期匹配最近的交易日的话语句逻辑怎么写啊

img

比如20220101 20220102 20220103标志是2为非交易日;这三个日期的交易日是标志为1离它们最近的20220104。怎么把所有发生日期的交易日找到。

这个表看上去是个日历表,所以假定发生日期中间没有日期缺失

with t(发生日期,是否交易日期) asselect date'2022-01-01',2 from dual union all
select date'2022-01-02',2 from dual union all
select date'2022-01-03',2 from dual union all
select date'2022-01-04',1 from dual union all
select date'2022-01-05',1 from dual union all
select date'2022-01-06',1 from dual union all
select date'2022-01-07',1 from dual union all
select date'2022-01-08',2 from dual union all
select date'2022-01-09',2 from dual union all
select date'2022-01-10',1 from dual 
)
select t1.发生日期,
       case
         when 是否交易日期 = 1 then
          发生日期
         else
          max(发生日期) over(partition by d) + 1
       end 交易日期
  from (select t.*,
               sum(case 是否交易日期
                     when 2 then
                      0
                     else
                      1
                   end) over(order by 发生日期) d
          from t) t1

img

把标志是1的每段数据最小时间那天拿出来就是交易日了吧,用排序作差