SQL学習~WINDOW関数編~
データエンジニアになって思ったこと
業務で使うクエリってすごく難しい!!!!!!!!!!!!
前職(システムエンジニア)の時はちょこっとだけクエリを書くことはあったものの、簡単なSELECT文や、CREATE文、DELETE文しか書いてこなかった。
でもデータエンジニアになってからかなり長いクエリを見て理解しないといけなくなった。
人が書いたものを理解してそれを修正したりする業務があり、かなり深い沼だぞこれは…と思った。
特に躓いたのはWINDOW関数。
基礎的なSUM関数ならわかるけどWINDOW関数とは何ぞや⁈となった。
WINDOW関数とは
まだわからない…。
形としてはこのような感じで書かれる。
avg(salary) OVER (PARTITION BY depname)
depnameごとのsalaryの平均が出されることになるのだが、
これがどう使えるのだろう?
本を読んでみる
読んでみたのはミッケさんが書いた『SQL実践入門 高速で分かりやすいクエリの書き方』。この文でようやくなんとなくWINDOW関数の使い方が分かった!
例えばpersonsというテーブルがあったとして、所属部署ごとの年齢合計を出したいとする。
そこで、集約関数を使うと、このように結果として出てくるテーブルが全然違った形で出てきてしまう。
nameやsalaryの内容は完全に無視されて、SELECTに入れることができない。
しかし、ここでWINDOW関数を使うことで、このように結果として出てくるテーブルは、既存テーブルに情報を追加する形で出すことができる。
つまりWINDOW関数の使いどころは、次の計算時に集計情報だけではなく元情報の何かを使用したいときだと理解できた!
WINDOW関数の個人的な集計イメージは、
窓(WINDOW)を開いて見える指定された項目(今回の場合はageとdepName)の集計結果を出した後、窓を閉めて結果テーブル完成
という感じ。
とにかく、入力元がすべて書き換わってしまうということは無く、入力元を窓から見て参照しただけであって直接手を加えていないよ~みたいなニュアンスが伝わればいいなと思う。
おわりに
WINDOW関数が理解できたから、業務で使うクエリがスラスラ読める…ということは無いが、「どうしてここでWINDOW関数を使っているんだろう?」という疑問が解消されたので、余計なことを考えずにクエリが読めるようになった。
あとは自分でクエリを作る時に、意図的にWINDOW関数を使えるようになれば理解は完璧だなと思う。