【SQL】ユーザーIDごとの集計に、 付加情報もつけてみよう!

【SQL】ユーザーIDごとの集計に、性別などの付加情報もつけてみよう!

どうも、hosigakiです!
今日は「GROUP BY句」に関する、ちょっとしたテクニックをご紹介します!

(検証環境:BigQuery)

基本的なGROUP BY句の使い方

GROUP BY句については、過去にこちらの記事で解説しました!
ここでは簡単に、GROUP BY句の基本的な使い方をおさらいしましょう!

idproductuser_idgenderagepurchased_at
1干し柿10男性302022-1-1
2干し柿ジュース10男性302022-1-1
3柿まんじゅう10男性302022-1-1
4干し柿11女性322022-1-3
5柿まんじゅう11女性322022-1-3
6干し柿12男性402022-1-4
purchasesテーブル

例えば、上記のpurchasesテーブルから、「user_id」ごとの購入数を抽出するとします。
この時、以下のように「GROUP BY句」を用いることで、user_idごとの集計が可能になります。

SELECT
    user_id,
    COUNT(user_id) AS num_of_purchases
FROM
    purchases
GROUP BY
    user_id
user_idnum_of_purchases
103
112
121
上記クエリの抽出結果

GROUP BYで、付加情報もつけよう!

ここからが今日の本題です!
先ほどの抽出結果で、user_idの隣に、性別や年齢などの付加情報もつけたら、よりユーザーの特徴が掴めて良いと思いませんか?

user_idgenderagenum_of_purchases
10男性303
11女性322
12男性401
↑ こんな感じに抽出したい

実は、以下のようなクエリを書くことで、上記のような抽出結果にすることができるんです!
先ほどのクエリとの違い、どこか分かるでしょうか?

SELECT
    user_id,
    gender,
    age,
    COUNT(user_id) AS num_of_purchases
FROM
    purchases
GROUP BY
    user_id,
    gender,
    age

先ほどとの違いは、GROUP BY句とSELECT句に、genderageが入っている点です。
注目していただきたいのはGROUP BY句の方で、ここでは以下のようにグループ化を行っています。

group by の結果
① user_idごとにレコードをグループ分け
(user_idは三種類あるため、できるグループも3つ)

↓

② ①の各グループ内で、さらにgenderごとにレコードをグループ分け
(実際には①の各グループごとに一種類のgenderの値しかないため、できるグループも1つずつ)

↓

③ ②の各グループ内で、さらにageごとにレコードをグループ分け
(実際には②の各グループごとに一種類のageの値しかないため、できるグループも1つずつ)

グループ化を行ったら、group by句で書いたのと同じカラムをSELECT句にも書き、その下に集約関数を書いて、完成です!

今日はGROUP BY句のちょっとしたテクニックを紹介しました!

ここまで読んでくださりありがとうございました!
また次の記事でお会いしましょう(^^)/

-SQL
-, ,