こんにちは、hosigakiです!
夏も終わりに近づいてきましたね。
今日はウィンドウ関数で、PARTITION BY という構文について説明します。
(ウィンドウ関数について分からない方は、こちらの記事で詳しく解説しているので、ご参考ください!)
PARTITION BY について
PARTITION BY とは何か
ウィンドウ関数では、「PARTITION BY」という構文が用意されています。
PARTITION とは、「分割」や「仕切り」という意味です。
使い方としては、ウィンドウ関数のOVER句内で、
PARTITION BY カラム名
と記載することで、指定したカラム名の値に応じて、レコードをグループ分けし、それぞれのグループをウィンドウ関数の範囲として適用することができます。
恐らく、言葉だけだとかなりイメージしづらいので、
実際にPARTITION BY を使ったクエリを見てみましょう!
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 |
仮に上記のpurchasesテーブルがあったとします。
例えば、2行目はよしおさんの1回目の購入、5行目はよしおさんの2回目の購入ですよね。
こんな感じで、上記のテーブルの一番右側に、「その購入はそのユーザーにとって何回目の購入か」を示す「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 |
例えば、よしおは一回目に干し柿を購入し、二回目に柿まんじゅうを購入した ということが分かる。
ここで、今回のテーマである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 について紹介しました!
なかなか慣れるまで難しいですが、慣れるとめちゃくちゃ便利なため、ぜひガンガン使ってみてください!
最後まで読んでいただき、ありがとうございました!
また次の記事でお会いしましょう(^^)/