How to generate date series to occupy absent dates in google BiqQuery?

后端 未结 5 2149
自闭症患者
自闭症患者 2020-12-03 11:44

I am trying to get daily sum of sales from a google big-query table. I used following code for that.

select Day(InvoiceDate) date, Sum(InvoiceAmount) sales f         


        
5条回答
  •  时光说笑
    2020-12-03 12:20

    You can use below to generate on fly all dates in given range (in below example it is all dates from 2015-06-01 till CURRENT_DATE() - by changing those you can control which dates range to generate)

    SELECT DATE(DATE_ADD(TIMESTAMP("2015-06-01"), pos - 1, "DAY")) AS calendar_day
    FROM (
         SELECT ROW_NUMBER() OVER() AS pos, *
         FROM (FLATTEN((
         SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(CURRENT_DATE()), TIMESTAMP("2015-06-01")), '.'),'') AS h
         FROM (SELECT NULL)),h
    )))
    

    so, now - you can use it with LEFT JOIN with your table to have all dates accounted. See potential example below

    SELECT
      calendar_day,
      IFNULL(sales, 0) AS sales
    FROM (
      SELECT DATE(DATE_ADD(TIMESTAMP("2015-06-01"), pos - 1, "DAY")) AS calendar_day
      FROM (
           SELECT ROW_NUMBER() OVER() AS pos, *
           FROM (FLATTEN((
           SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(CURRENT_DATE()), TIMESTAMP("2015-06-01")), '.'),'') AS h
           FROM (SELECT NULL)),h
      )))
    ) AS all_dates
    LEFT JOIN (
      SELECT DAY(InvoiceDate) DATE, SUM(InvoiceAmount) sales 
      FROM test_gmail_com.sales 
      WHERE YEAR(InvoiceDate) = YEAR(CURRENT_DATE()) AND
      MONTH(InvoiceDate) = MONTH(CURRENT_DATE())
      GROUP BY DATE 
    )
    ON DATE = calendar_day  
    

    I wanna need to get previous months sales

    Below gives all days of previous month

    SELECT DATE(DATE_ADD(DATE_ADD(DATE_ADD(CURRENT_DATE(), -1, "MONTH"), 1 - DAY(CURRENT_DATE()), "DAY"), pos - 1, "DAY")) AS calendar_day
    FROM (
         SELECT ROW_NUMBER() OVER() AS pos, *
         FROM (FLATTEN((
         SELECT SPLIT(RPAD('', 1 + DATEDIFF(DATE_ADD(CURRENT_DATE(), - DAY(CURRENT_DATE()), "DAY"), DATE_ADD(DATE_ADD(CURRENT_DATE(), -1, "MONTH"), 1 - DAY(CURRENT_DATE()), "DAY")), '.'),'') AS h
         FROM (SELECT NULL)),h
    )))
    

提交回复
热议问题