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

后端 未结 5 2148
自闭症患者
自闭症患者 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:29

    Using the Standard SQL dialect and the generate_array function to simplify the code:

    WITH serialnum AS (
      SELECT
        sn
      FROM
        UNNEST(GENERATE_ARRAY(0, 
                              DATE_DIFF(DATE_ADD(DATE_TRUNC(CURRENT_DATE()
                                                          , MONTH)
                                              , INTERVAL 1 MONTH)
                                      , DATE_TRUNC(CURRENT_DATE(), MONTH)
                                      , DAY) - 1)
                              ) AS sn
    ), date_seq AS (
    SELECT
        DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH),
                INTERVAL(sn) DAY) AS this_day
    FROM
      serialnum
    )
    SELECT
        Day(InvoiceDate) date
        , Sum(IFNULL(InvoiceAmount, 0)) sales
    FROM
        date_seq
        LEFT JOIN
        test_gmail_com.sales
    ON
        date_seq.this_day = DAY(test_gmail_com.sales.InvoiceDate)
    WHERE
        year(InvoiceDate) = Year(current_date())
        and
        Month(InvoiceDate) = Month(current_date())
    GROUP BY
        date
    ORDER BY
        date
    ;
    

    UPDATE

    Or, simpler still using the generate_date_array function:

    WITH date_seq AS (
    SELECT
      GENERATE_DATE_ARRAY(DATE_TRUNC(CURRENT_DATE(), MONTH), 
                          DATE_ADD(DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH)
                                            , INTERVAL 1 MONTH)
                                   , INTERVAL -1 DAY)
                          , INTERVAL 1 DAY)
        AS this_day
    )
    SELECT
        Day(InvoiceDate) date
        , Sum(IFNULL(InvoiceAmount, 0)) sales
    FROM
        date_seq
        LEFT JOIN
        test_gmail_com.sales
    ON
        date_seq.this_day = DAY(test_gmail_com.sales.InvoiceDate)
    WHERE
        year(InvoiceDate) = Year(current_date())
        and
        Month(InvoiceDate) = Month(current_date())
    GROUP BY
        date
    ORDER BY
        date
    ;
    

提交回复
热议问题