🐛

SQLのGROUP BYとPARTITION BYの違いについて

2023/01/07に公開

GROUP BYとは

指定したカラムを条件に一行ごとにまとめるもの
select max(height), class_name from main.students group by class_name
このような使い方をすれば学校のクラスごとの最も高い身長の値がわかる

PARTITION BYとは

partitionの名前の通り指定したカラムの値ごとにレコードを仕切るものだ。(パーテーションがレコードの間に挟まっているようなイメージ)
先ほどのクラスの例を持って考えてみる。
group byだとクラスごとの身長の最高値はわかるが、その最高値の背を持つ生徒の名前はわからない。
そう言った際にはpartition byがとても便利だ
select name, height, ROWNUMBER() over(partition by class_name order by height) 身長 from main.students

これでクラスごとの最も身長の高い生徒の身長と名前、クラス内での順位がわかる

クエリを何本も投げて良いような場合ならわざわざこんなことをする必要はない
でもDBアクセスのオーバーヘッドコストを鑑み、クエリを一つにまとめたい時はこのような使い方が便利だろう。

また知見が溜まり次第更新する

Discussion