Duplicating records to fill gap between dates in Google BigQuery

前端 未结 2 394
刺人心
刺人心 2021-01-14 08:08

So I\'ve found similar resources that address how to do this in SQL, like this: Duplicating records to fill gap between dates

I understand that BigQuery may not be t

相关标签:
2条回答
  • 2021-01-14 08:51

    I need to generate a table that has all the dates within a given range, but I'm having a hard time understanding if this can be done. Any ideas?

    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
    )))
    
    0 讨论(0)
  • 2021-01-14 08:57

    How can I build a query within Google BigQuery that yields an output like the one below? A value at a given date is repeated until the next change for the dates in between

    See example below

    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 讨论(0)
提交回复
热议问题