2016-08-13 60 views
2

,解決如何在SQL做到這一點,像這樣所以我已經發現了類似的資源: Duplicating records to fill gap between dates仿型記錄填寫日期之間的差距在谷歌的BigQuery

我理解的BigQuery未必是做的最好的地方這個,所以我想看看它是否可能。當試圖運行上面鏈接中的某些方法時,由於BigQuery中不支持某些功能,因此我正在碰壁。

如果數據存在的表結構如下所示:

MODIFY_DATE    SKU   STORE STOCK_ON_HAND 
    08/01/2016 00:00:00  1120010  21  100 
    08/05/2016 00:00:00  1120010  21  75 
    08/07/2016 00:00:00  1120010  21  40 

如何建立能產生類似下面的輸出谷歌的BigQuery中的查詢?重複直到在兩者之間的日期的下一個變化在給定的日期值:

MODIFY_DATE    SKU   STORE STOCK_ON_HAND 
    08/01/2016 00:00:00  1120010  21  100 
    08/02/2016 00:00:00  1120010  21  100 
    08/03/2016 00:00:00  1120010  21  100 
    08/04/2016 00:00:00  1120010  21  100 
    08/05/2016 00:00:00  1120010  21  75 
    08/06/2016 00:00:00  1120010  21  75 
    08/07/2016 00:00:00  1120010  21  40 

我知道我需要生成具有給定範圍內的所有日期的表,但我有一個硬如果可以做到這一點,我們會及時瞭解。有任何想法嗎?

+0

你可以在答案投票下一個變化。表決有用的答案。還有更多...當有人回答你的問題時,你可以檢查該怎麼做 - stackoverflow.com/help/someone-answers。如果您發現下面的答案有用並解決您的問題,請執行以下操作:o) –

回答

0

如何建立能產生類似下面的輸出谷歌的BigQuery中的查詢?重複在一個給定的日期值,直到日期在

下面

之間

見例如

SELECT 
    MODIFY_DATE, 
    MAX(SKU_TEMP) OVER(PARTITION BY grp) AS SKU, 
    MAX(STORE_TEMP) OVER(PARTITION BY grp) AS STORE, 
    MAX(STOCK_ON_HAND_TEMP) OVER(PARTITION BY grp) AS STOCK_ON_HAND, 
FROM (
    SELECT 
    DAY AS MODIFY_DATE, SKU AS SKU_TEMP, STORE AS STORE_TEMP, STOCK_ON_HAND AS STOCK_ON_HAND_TEMP, 
    COUNT(SKU) OVER(ORDER BY DAY ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS grp, 
    FROM (
    SELECT DATE(DATE_ADD(TIMESTAMP("2016-08-01"), pos - 1, "DAY")) AS DAY 
    FROM (
     SELECT ROW_NUMBER() OVER() AS pos, * 
     FROM (FLATTEN((
     SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP("2016-08-07"), TIMESTAMP("2016-08-01")), '.'),'') AS h 
     FROM (SELECT NULL)),h 
    ))) 
) AS DATES 
    LEFT JOIN (
    SELECT DATE(MODIFY_DATE) AS MODIFY_DATE, SKU, STORE, STOCK_ON_HAND 
    FROM 
     (SELECT "2016-08-01" AS MODIFY_DATE, "1120010" AS SKU, 21 AS STORE, 75 AS STOCK_ON_HAND), 
     (SELECT "2016-08-05" AS MODIFY_DATE, "1120010" AS SKU, 22 AS STORE, 100 AS STOCK_ON_HAND), 
     (SELECT "2016-08-07" AS MODIFY_DATE, "1120011" AS SKU, 23 AS STORE, 40 AS STOCK_ON_HAND), 
) AS TABLE_WITH_GAPS 
    ON TABLE_WITH_GAPS.MODIFY_DATE = DATES.DAY 
) 
ORDER BY MODIFY_DATE 
+0

感謝Mikhail,這是一個示例,但需要針對動態範圍的日期和SKU進行調整。偉大的工作人員,欣賞它的洞察力。 – jab

+0

嘿@Mikhail,我和原始海報有完全相同的問題,當我的表格中只有一個SKU時,您的答案正常工作,但是當我有多個SKU和商店時,並且需要填寫每個SKU和商店的日期那些,你的查詢不起作用。另外,我希望在標準SQL中看到解決方案。你願意更新你的答案嗎?謝謝! –

+0

@GustavoDaniloMachado - 我的答案是針對特定問題「量身定製」的,並不適合所有情況。如果你發佈新的問題 - 我會很樂意回答你的:o) –

0

我需要生成一個表,其中包含給定範圍內的所有日期,但我很難理解這是否可以完成。有任何想法嗎?

SELECT DATE(DATE_ADD(TIMESTAMP("2016-08-01"), pos - 1, "DAY")) AS DAY 
FROM (
    SELECT ROW_NUMBER() OVER() AS pos, * 
    FROM (FLATTEN((
    SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP("2016-08-07"), TIMESTAMP("2016-08-01")), '.'),'') AS h 
    FROM (SELECT NULL)),h 
)))