簡體   English   中英

填充表格中缺少的組合

[英]filling missing combination in a table

輸入:

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

輸出:

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

所以就像每當缺少任何月份時,我都應該用這個邏輯來填充那個月。

我寫了一個腳本,它是兩步過程,但它只考慮值之間缺少月份而不是邊界值,即它不會假設 10 丟失,因為它是邊界值。

第一步:為所有其他列插入帶有 NULL 的缺失月份。

 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;

第 2 步:使用滯后填充其他列的值,其中包含與它相關的行的值。

然后使用Window函數計算數量值。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM