【SQL】ウィンドウ関数で、PARTITION BY を使いこなそう!

【SQL】ウィンドウ関数で、PARTITION BY を使いこなそう!

こんにちは、hosigakiです!
夏も終わりに近づいてきましたね。

今日はウィンドウ関数で、PARTITION BY という構文について説明します。
ウィンドウ関数について分からない方は、こちらの記事で詳しく解説しているので、ご参考ください!)

PARTITION BY について

PARTITION BY とは何か

ウィンドウ関数では、「PARTITION BY」という構文が用意されています。
PARTITION とは、「分割」や「仕切り」という意味です。

使い方としては、ウィンドウ関数のOVER句内で、

PARTITION BY カラム名

と記載することで、指定したカラム名の値に応じて、レコードをグループ分けし、それぞれのグループをウィンドウ関数の範囲として適用することができます。

恐らく、言葉だけだとかなりイメージしづらいので、
実際にPARTITION BY を使ったクエリを見てみましょう!

PARTITION BY の使用例

user_namepurchase_itempurchased_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
purchasesテーブル

仮に上記のpurchasesテーブルがあったとします。

例えば、2行目はよしおさんの1回目の購入、5行目はよしおさんの2回目の購入ですよね。
こんな感じで、上記のテーブルの一番右側に、「その購入はそのユーザーにとって何回目の購入か」を示す「purchase_times」カラムを追加したいと思います。

抽出結果のイメージは以下の通りです。

user_namepurchase_itempurchased_atpurchase_times
太郎干し柿2022-1-11
よしお干し柿2022-1-11
太郎干し柿ジュース2022-1-22
ジム干し柿2022-1-31
よしお柿まんじゅう2022-1-32
太郎柿まんじゅう2022-1-33
太郎干し柿2022-1-44
ジム干し柿2022-1-42
抽出結果イメージ。
例えば、よしおは一回目に干し柿を購入し、二回目に柿まんじゅうを購入した ということが分かる。

ここで、今回のテーマであるPARTITION BYの出番です!
以下のようなクエリを実行することで、上記のようなカラムを追加できます。

SELECT
    *,
    RANK() OVER(PARTITION BY user_name ORDER BY purchased_at) AS purchase_times
FROM
    purchases

注目していただきたいのは2行目。ここでは次のような処理を行っています。

  • OVER句内で、PARTITION BY user_nameと記載することで、user_name別にレコードをグルーピング
  • その後ろに、ORDER BY purchased_at と記載することで、各グループ内のレコードをpurchased_at順に並び替え
  • OVER句の前に RANK( ) と記載することで、各グループ内の並び替え済みのレコードを、上から順に順位を割り振る

これにより、各レコードに対して、その人がその購入を何回目に行ったのか、を示すことができましたね!

今回は、ウィンドウ関数の構文の一つ、PARTITION BY について紹介しました!
なかなか慣れるまで難しいですが、慣れるとめちゃくちゃ便利なため、ぜひガンガン使ってみてください!

最後まで読んでいただき、ありがとうございました!
また次の記事でお会いしましょう(^^)/

-SQL
-, , , ,