どうも、hosigakiです!
今日は、「QUALIFY句」の使い方を紹介します!
QUALIFYって何?
QUALIFY句とは、ウィンドウ関数の結果で抽出結果を絞り込むことができる関数です!
(ウィンドウ関数について知りたい方は、こちらの記事を参考ください!)
2021年にBigQueryからリリースされた機能で、使いこなすとクエリをすっきり書くことができます!
どんな関数かのイメージを持っていただくために、具体例を元に使い方を見ていきましょう!
QUALIFY句の使い方
今回は、前回の記事「ウィンドウ関数でPARTITION BY を使いこなそう!」で取り上げたのと同じ例を元に説明します。
user_name | purchase_item | purchased_at |
---|---|---|
太郎 | 干し柿 | 2022-1-1 |
よしお | 干し柿 | 2022-1-1 |
太郎 | 干し柿ジュース | 2022-1-2 |
ジム | 干し柿 | 2022-1-3 |
よしお | 柿まんじゅう | 2022-1-3 |
太郎 | 柿まんじゅう | 2022-1-3 |
太郎 | 干し柿 | 2022-1-4 |
ジム | 干し柿 | 2022-1-4 |
前回は、上記のpurchaseテーブルに対して、以下のようにpurchase_timesカラムをつける例を取り上げました。
user_name | purchase_item | purchased_at | purchase_times |
---|---|---|---|
太郎 | 干し柿 | 2022-1-1 | 1 |
よしお | 干し柿 | 2022-1-1 | 1 |
太郎 | 干し柿ジュース | 2022-1-2 | 2 |
ジム | 干し柿 | 2022-1-3 | 1 |
よしお | 柿まんじゅう | 2022-1-3 | 2 |
太郎 | 柿まんじゅう | 2022-1-3 | 3 |
太郎 | 干し柿 | 2022-1-4 | 4 |
ジム | 干し柿 | 2022-1-4 | 2 |
例えば、よしおは一回目に干し柿を購入し、二回目に柿まんじゅうを購入した ということが分かる。
purchase_timesカラムを追加するためのクエリは、以下になります。
SELECT
*,
RANK() OVER(PARTITION BY user_name ORDER BY purchased_at) AS purchase_times
FROM
purchases
本日はここからが本題!
この結果から、「2回目のユーザーの購入レコード」(すなわち purchase_times = 2
のレコード)のみを抽出するためには、どんなクエリを書くことができるでしょうか?
今回は、QUALIFY句を用いないクエリと、用いたクエリ、2通り紹介します!
QUALIFY句を用いないクエリ
/*QUALIFY句を用いない例*/
WITH
p AS (
SELECT
*,
RANK() OVER(PARTITION BY user_name ORDER BY purchased_at) AS purchase_times
FROM
purchases
)
SELECT
*
FROM
p
WHERE
purchase_times = 2
上記クエリでは、WITH句を用いることで、以下のように2回に分けて抽出しています。
- purchase_timesカラムが追加されたテーブルの抽出
- 上記の内、
purchase_times = 2
のレコードだけの抽出
ちなみに、WITH句ではなくサブクエリを使う場合は、以下のようなクエリになりますが、WITH句を使う時と同様に、2回に分けて抽出しています。
/*QUALIFY句を用いない例*/
SELECT
*
FROM (
SELECT
*,
RANK() OVER(PARTITION BY user_name ORDER BY purchased_at) AS purchase_times
FROM
purchases
)
WHERE
purchase_times = 2
QUALIFY句を用いたクエリ
/*QUALIFY句を用いたクエリ*/
SELECT
*,
RANK() OVER(PARTITION BY user_name ORDER BY purchased_at) AS purchase_times
FROM
purchases
QUALIFY
purchase_times = 2
先ほどと違うのは、WITH句やサブクエリを用いず、QUALIFY句の中で purchase_times = 2
を記載することで、以下二つの処理を同時に行っている点です。
- purchase_timesカラムが追加されたテーブルの抽出
- 上記の内、
purchase_times = 2
のレコードだけの抽出
先ほどのクエリと比べると、ずいぶんスッキリして見やすい印象ですね!
QUALIFY句を用いる上での注意点
QUALIFY句を使う際は、QUALIFY句もしくはSELECT句の中で、ウィンドウ関数を書く必要があります。
例えば以下のように、ウィンドウ関数を書かずにWHERE句のような使い方をした場合は、エラーになりますので注意しましょう!
SELECT
*
FROM
purchases
QUALIFY
user_name = "よしお"
今回はQUALIFY句について紹介しました!
使いこなすとクエリをスッキリ書けるので、ぜひぜひ積極的に使ってみてください!
ここまで読んでいただき、ありがとうございました!
また次の記事でお会いしましょう(^^)/