0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BiqQueryでGENERATE_DATE_ARRAY関数を使用して日ごとの売上データを集計する

Last updated at Posted at 2022-09-27

背景

商品ごとの売上記録を日ごとに集計し、ダッシュボードやスプレッドシートへ日付が過去のデータから順に出力する。
ここで、商品の購入数を日ごとに集計する際、 過去の日付の購入数データから順にダッシュボードやスプレッドシートへ出力する。
しかし、購入実績がない日付のデータも購入数0として表示させたくても、購入履歴のある日付ごとのみで GROUP BY 句により集約されるため、購入のない日付が飛んだ状態で表示されてしまう。

例)
商品テーブルのイメージ
商品Aについて、時系列に注文された購入情報が格納されているが、購入された日付の情報のみ格納されている。
商品Aオーダーテーブル.png
ダッシュボード等へのグラフ出力イメージ
上記テーブルから日付(order_dt)ごとに GROUP BY 句で集計した場合、注文のない日付は注文点数0としたいが、2022/06/022022/06/06の商品Aの注文がないため、以下のグラフの2022/06/022022/06/06の日付データが飛んだ状態となってしまう。
日付ごとの商品Aの注文点数.png

目的

集計対象の商品の注文がない日付でも購入数なしデータとして情報を持たせ、ダッシュボード、あるいはスプレッドシートへ表示させるため、そこで GENERATE_DATE_ARRAY 関数を使用し、集計の期間に必要な全日付を取得して売上記録を日付ごとにソートする。

説明

GENERATE_DATE_ARRAY(start_date, end_date[, INTERVAL INT64_expr date_part])

start_date : 開始日を入れる
end_date : 終了日を入れる
INTERVAL : INT64_exprINT64date_partDAYWEEKMONTHQUARTER または YEAR を指定する

対応方法

連続した日付データを取得するため、ここで GENERATE_DATE_ARRAY 関数を用いる。
Step1)
GENERATE_DATE_ARRAY 関数を用いて、集計に必要な期間の基準となる日付(以下、基準日)を抽出する。

SELECT
    GenarateDate
FROM
    UNNEST(GENERATE_DATE_ARRAY('2022-06-01', '2022-06-10')) AS GenarateDate

Step2)
対象期間の売上データを日付ごとに集計し、Step1で抽出した基準日へ購入日付を結合キーとして外部結合する。

--データの抽出の対象となる期間を日付ごとに全て取得
WITH GENARATE_TIME AS (
SELECT
    GenarateDate
FROM
    UNNEST(GENERATE_DATE_ARRAY('2022-06-01', '2022-06-10')) AS GenarateDate
)

SELECT
    GenarateDate
    ,GoodsID
    ,GoodsName
    ,DailyQuantity
FROM 
    GENARATE_TIME
    LEFT JOIN (
        SELECT
            OrderDate
            ,GoodsID
            ,GoodsName
            ,SUM(Quantity) AS DailyQuantity
        FROM
            `test_dataset.samle_order_table` order
        WHERE
            OrderDate BETWEEN '2022-06-01' AND '2022-06-10'
        GROUP BY
            OrderDate
            ,GoodsID
            ,GoodsName
        ) ON GenarateDate = OrderDate
;

クエリの実行結果

クエリの実行結果としては、2022/06/01~2022/06/10の期間で日付ごとに商品Aの購入数の合計を集計するというものである。

GENERATE_DATE_ARRAY 関数による基準日の使用なし」と「GENERATE_DATE_ARRAY 関数による基準日の使用あり」を比較すると、なしの場合は商品Aの購入のなかった 2022/06/022022/06/05~2022/06/062022/06/08~2022/06/09は、レコード自体が存在しない。

それに対し、ありの場合は購入のなかった日でも連続した日付でデータを取得できている。購入数が NULL となっているが、気になるようであればクエリで0に更新するか、データポータルへ表示するのであればデータポータル上でも編集が可能となるが、本稿のテーマ外であるため省略。

GENERATE_DATE_ARRAY関数による基準日の使用なし

結果_ノーマル.png

GENERATE_DATE_ARRAY関数による基準日の使用あり

結果_Genarate_Array.png

参考

GENERATE_DATE_ARRAY 関数の使用規約については以下のリンクを参照
https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions?hl=ja#generate_date_array

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?