どうも、hosigakiです!
今日はHAVING句の使い方について紹介します!
そもそもHAVING句って何?
HAVING句とは、
GROUP BY句と組み合わせて使う、実行結果を絞るための構文のことです。
まずは実際の利用例を見てみましょう!
HAVING句の使い方(入門編)
以下のpurchasesテーブルから、合計購入数が2個以上のproductごとの、合計購入数を算出するとします。
id | product | user_id | gender | age | purchased_at |
---|---|---|---|---|---|
1 | 干し柿 | 10 | 男性 | 30 | 2022-1-1 |
2 | 干し柿ジュース | 10 | 男性 | 30 | 2022-1-1 |
3 | 柿まんじゅう | 10 | 男性 | 30 | 2022-1-1 |
4 | 干し柿 | 11 | 女性 | 32 | 2022-1-3 |
5 | 柿まんじゅう | 11 | 女性 | 32 | 2022-1-3 |
6 | 干し柿 | 12 | 男性 | 40 | 2022-1-4 |
まずは、単純にproduct別の合計購入数を算出してみましょう。
以下は、クエリとその実行結果です。
SELECT
product,
COUNT(product) AS n_of_products
FROM
purchases
GROUP BY
product
product | n_of_products |
---|---|
干し柿 | 3 |
干し柿ジュース | 1 |
柿まんじゅう | 2 |
ここで、上記クエリにHAVING句を追加することで、合計購入数が2個以上のproductのみに絞ることができます!
以下は、HAVING句を追加したクエリとその実行結果です。
SELECT
product,
COUNT(product) AS n_of_products
FROM
purchases
GROUP BY
product
HAVING
COUNT(product) >= 2
product | n_of_products |
---|---|
干し柿 | 3 |
柿まんじゅう | 2 |
先ほどの実行結果から、n_of_productsが1の「柿ジュース」のレコードが除外されましたね!
このように、HAVING句はGROUP BY句と組み合わせて使うことで、実行結果を絞ることができるんです!
HAVING句の使い方(発展編)
id | product | user_id | gender | age | purchased_at |
---|---|---|---|---|---|
1 | 干し柿 | 10 | 男性 | 30 | 2022-1-1 |
2 | 干し柿ジュース | 10 | 男性 | 30 | 2022-1-1 |
3 | 柿まんじゅう | 10 | 男性 | 30 | 2022-1-1 |
4 | 干し柿 | 11 | 女性 | 32 | 2022-1-3 |
5 | 柿まんじゅう | 11 | 女性 | 32 | 2022-1-3 |
6 | 干し柿 | 12 | 男性 | 40 | 2022-1-4 |
先ほどは、上記のpurchasesテーブルから、
合計購入数が2個以上のproductごとの、合計購入数 を算出しましたね!
次は、
合計購入数が2個以上のproductごとの、(合計購入数ではなく、)最年長購入者の年齢
を算出してみましょう!
クエリと実行結果は以下になります。
先ほどのクエリと比べると、「COUNT(product)」が「MAX(age)」に変わっています。
SELECT
product,
MAX(age) AS max_age
FROM
purchases
GROUP BY
product
HAVING
COUNT(product) >= 2
product | max_age |
---|---|
干し柿 | 40 |
柿まんじゅう | 32 |
ここでは、次のような順で処理が行われています。
- purchasesテーブルのレコードをproduct別にグルーピング。
- 各グループ中、グループ内でのproductの合計数が2個以上のグループのみに絞る
- 残ったグループ内で、ageの最大値を算出
これで、合計購入数が2個以上のproductごとの、最年長購入者の年齢 を算出できましたね!
もうお分かりのように、HAVING句とSELECT句の記載を必ずしも合わせる必要はありません。
HAVING句はあくまで「GROUP BY句でグルーピングされたレコードを絞るための構文」であり、絞った後にSELECT句で何を書くかは自由
ということを覚えておくと、分析の幅が広がります!
HAVING句のより詳細な情報は、BigQueryの公式リファレンス に記載されているので、興味がある方はご参考ください!
ここまで読んでくださりありがとうございました!
また次の記事でお会いしましょう(^^)/