用lag补满数据

现在如下数据

SQL> select * from test;
DATES              KEY
----------- ----------
2014-01-01           3
2015-05-01           5
2015-01-01           4

要求把中间缺失的月份补满,结果如下:

DATES              KEY
----------- ----------
2014-01-01           3
2014-02-01           3
2014-03-01           3
2014-04-01           3
2014-05-01           3
2014-06-01           3
2014-07-01           3
2014-08-01           3
2014-09-01           3
2014-10-01           3
2014-11-01           3
2014-12-01           3
2015-01-01           4
2015-02-01           4
2015-03-01           4
2015-04-01           4
2015-05-01           5
17 rows selected

这种使用分析函数,可以很容易的达到目的

WITH a AS
 (SELECT nd, md, months_between(md, nd) diff
    FROM (SELECT MIN(dates) nd, MAX(dates) md FROM test))
SELECT a1.dates,
       nvl(s.key, lag(key ignore NULLS) over(ORDER BY a1.dates)) AS newkey
  FROM (SELECT add_months(nd, (LEVEL - 1)) AS dates
          FROM a
        CONNECT BY LEVEL <= diff + 1) a1
  LEFT JOIN test s
    ON a1.dates = s.dates
 ORDER BY 1;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值