SQLのWINDOW関数
SQLのWindow関数
MySQLはv8.0.2からサポート
MySQL v8
SQLのWINDOW関数を簡単な例を見て理解する
無名ウィンドウ構文
code:SQL
SELECT shohin_id, shohin_mei, hanbai_tanka,
AVG (hanbai_tanka) OVER (ORDER BY shohin_id
ROWS BETWEEN 2 PRECEDING
AND CURRENT ROW) AS moving_avg
FROM Shohin;
OVERのあとの()の中身がwindowなのかmrsekut.icon
名前付きウィンドウ構文
code:sql
SELECT shohin_id, shohin_mei, hanbai_tanka,
AVG(hanbai_tanka) OVER W AS moving_avg
FROM Shohin
WINDOW W AS (ORDER BY shohin_id
ROWS BETWEEN 2 PRECEDING
AND CURRENT ROW);
WINDOW W ASのあとのカッコの中身がwindowなのかmrsekut.icon
無名ウィンドウ構文と名前付きウィンドウ構文にはそれぞれ利点があるので場合によって使い分けるのが良いらしい
前者はシンプルに書ける
後者はwindowの使い回しができる
名前付きウィンドウ構文には対応していないDBMSもある
window関数の3つの機能
PARTITION BY句によるRecord集合のcut
ORDER BY句によるRecordの順序付け
FRAME句に依るcurrent recordを中心としたsubsetの定義
SQLのGROUP BYと比較して何が良いのか?
WINDOW関数はカットの部分のみを担い、適当な集約関数と組み合わせて使用する
だから、カットと集約がセットになっているGROUP BYと比べて、
より柔軟に集約ができる
みたいな感じ #??
若干わかりづらいのは、
集約&カットのGROUP BYと、
カットのみのOVER (..)が、
出現する場所が異なる点mrsekut.icon
GROUP BYはSQLの最後の方に書くのが普通だが、OVER (..)はSELECT句内に書く
これはmrsekut.iconが知らんだけで、他の場所に書けるのかもしれないけど
#??
この辺のキーワードは全てウィンドウ関数専用のものなのか?
WINDOW, ROWS, OVER, CURRENT, ROW, ROWS, PRECEDING
SQLをシランので判別できない
参考
『SQL実践入門』 p.65~
シンプルで基本的なことがわかりやすい
『達人に学ぶSQL徹底指南書 第2版』 p.26~