微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle查询以在同一表中填写丢失的数据

如何解决Oracle查询以在同一表中填写丢失的数据

我在oracle中有一个表,该表缺少给定ID的数据。我正在尝试找出sql来填充从开始日期:01/01/2019到end_dt:10/1/2020的数据。请参阅下面的输入数据。对于状态键,可以根据其先前的状态键填充数据。看到输入:

enter image description here

预期输出

enter image description here

解决方法

您可以使用递归查询生成日期,然后cross join生成日期,并在表中提供不同的id列表。然后,使用窗口函数带来缺少的键值:

with recursive cte (mon) as (
    select date '2019-01-01' mon from dual
    union all select add_months(mon,1) from cte where mon < date '2020-10-01'
)
select i.id,coalesce(
        t.status_key,lead(t.previous_status_key ignore nulls) over(partition by id order by c.mon)
    ) as status_key,lag(t.status_key ignore nulls,1,-1) over(partition by id order by c.mon)
    ) previous_status_key,c.mon
from cte c
cross join (select distinct id from mytable) i
left join mytable t on t.mon = c.mon and t.id = i.id

您没有提供有关如何带走丢失的status_keyprevious_status_key的很多细节。这是查询的作用:

  • status_key来自下一个非null previous_status_key

  • previous_status_key取自最后一个非null status_key,默认值为-1

,

您可以生成日期,然后使用cross join和一些其他逻辑来获取所需的信息:

with dates (mon) as (
      select date '2019-01-01' as mon
      from dual
      union all
      select mon + interval '1' month
      from dates
      where mon < date '2021-01-01'
     )
select d.mon,i.id,coalesce(t.status_key,lag(t.status_key ignore nulls) over (partition by i.id  order by d.mon)
               ) as status_key,coalesce(t.previous_status_key,lag(t.previous_status_key ignore nulls) over (partition by i.id  order by d.mon)
               ) as previous_status_key
from dates d cross join
     (select distinct id from t) i left join 
     t
     on d.mon = t.mon and i.id = i.id;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。