この記事が解決できること
- WINDOW関数の簡略化をして可読性の高いSELECT句にできる
はじめに
今回は、WINDOW関数に名前を付けて、SELECT句をシンプルに読みやすくする方法をご紹介します。なんでこんなことを紹介するかというと、筆者自身がGA4のローデータを加工している際に、この方法を知って活用したことでクエリが読みやすくなったという経緯があります。
「1クエリの中で何度も何度もWINDOW関数を使うよ」って時は、間違いなく使った方がいいので是非この機会に覚えていってください。
では早速実践していきましょう!
BigQueryで実践してみた
今回の解説にあたっては、シンプルなテーブルを使って説明します。
このテーブルを使って、name ごとの
・salesの合計
・salesの平均
・salesの最大値
を出すにはどうしたらいいでしょうか。
通常であれば以下のようなクエリを組みます。
--検証用テーブルの作成
WITH master_table AS
(
SELECT
'tanaka' AS name
,1000 AS sales
UNION ALL
SELECT
'suzuki' AS name
,2000 AS sales
UNION ALL
SELECT
'suzuki' AS name
,4000 AS sales
UNION ALL
SELECT
'kimura' AS name
,3000 AS sales
)
--WINDOW関数を用いた演算
SELECT
name
,sales
,SUM(sales) OVER (PARTITION BY name) AS sum_sales
,AVG(sales) OVER (PARTITION BY name) AS avg_sales
,MAX(sales) OVER (PARTITION BY name) AS max_sales
FROM master_table
SELECT句の中で何度も何度もOVER~以降の記述が発生するので、少し読みづらさがあります。
それを、以下のように書き換えます。
--検証用テーブルの作成
WITH master_table AS
(
SELECT
'tanaka' AS name
,1000 AS sales
UNION ALL
SELECT
'suzuki' AS name
,2000 AS sales
UNION ALL
SELECT
'suzuki' AS name
,4000 AS sales
UNION ALL
SELECT
'kimura' AS name
,3000 AS sales
)
--WINDOW関数を用いた演算
SELECT
name
,sales
,SUM(sales) OVER w1 AS sum_sales
,AVG(sales) OVER w1 AS avg_sales
,MAX(sales) OVER w1 AS max_sales
FROM master_table
WINDOW w1 AS (PARTITION BY name)
このクエリでは、WINDOW句の中で名前付きのWINDOWとして指定をしてSELECT句で引用する形を取っています。
WINDOW句を記述すること自体でクエリの長さが出る場合もありますが、少なくともSELECT句を簡略化させることができます。
まとめ
今回は、WINDOW関数の小技について紹介しました。もちろん使わなくてもよい方法ではありますが、
日付ごとのクラスタごとのカテゴリごとの…みたいな記述を何度もごちゃごちゃと書くよりは、親切な設計になること間違いありません。
是非、何かの機会にご活用ください。