首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >填充表中缺少的组合

填充表中缺少的组合
EN

Stack Overflow用户
提问于 2020-08-25 18:50:59
回答 1查看 70关注 0票数 1

输入:

代码语言:javascript
复制
item   loc   month    year   qty
 A     DEL    5        2020   12
 A     DEL    6        2020   14
 A     DEL    8        2020   16
 A     DEL    9        2020   17

输出:

代码语言:javascript
复制
item   loc   month    year   qty
 A     DEL    5        2020   12
 A     DEL    6        2020   14
 A     DEL    7        2020   26
 A     DEL    8        2020   16
 A     DEL    9        2020   17
 A     DEL    10       2020   33

描述:

我的输入没有第7个月。所以为了计算7个月,我做了前两个月数量的总和。

例如,第7个月的输出将为12(从第5个月开始)+14(从第6个月开始)=26

所以这就像当任何一个月都会丢失时,我应该用这个逻辑来填充那个月。

EN

回答 1

Stack Overflow用户

发布于 2020-08-25 20:10:10

我已经写了一个脚本,这是两个步骤的过程,但它只考虑值之间的缺失月份,而不是边界值,即它不会假设10缺失,因为它是一个边界值。

第一步:插入misisng月份,其他所有列均为NULL。

代码语言:javascript
复制
 INSERT INTO TEST_MISSING(MONTH)
 select min_a - 1 + level
     from ( select min(MONTH) min_a
                 , max(MONTH) max_a
              from TEST_MISSING
          )
  connect by level <= max_a - min_a + 1
    minus
   select MONTH
     from TEST_MISSING;

第二步:使用lag填充其他列的值,这些值来自与它相关的行。

然后使用窗口函数计算量值。

代码语言:javascript
复制
SELECT NVL(ITEM, NEW_ITEM) ITEM, 
     NVL(LOC, NEW_LOC) LOC, 
     MONTH, NVL(YEAR, NEW_YEAR) YEAR,
     CASE WHEN QTY IS NULL THEN SUM(NVL(QTY, 0)) OVER(PARTITION BY NEW_ITEM ORDER BY MONTH ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) ELSE QTY END AS QTY
     FROM (
     SELECT A.*, 
     nvl(item,CASE WHEN ITEM IS NULL THEN (LAG(ITEM) OVER(ORDER BY MONTH)) END) NEW_ITEM,
     nvl(LOC,CASE WHEN LOC IS NULL THEN (LAG(LOC) OVER(ORDER BY MONTH)) END) NEW_LOC,
     nvl(YEAR,CASE WHEN YEAR IS NULL THEN (LAG(YEAR) OVER(ORDER BY MONTH)) END) NEW_YEAR
     FROM TEST_MISSING A) 
     X 
     ORDER BY MONTH;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63577292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档