OVER、PARTITION BY、ORDER BY
ウィンドウ関数のモデルを理解します。OVER、PARTITION BY(グループ化)、ORDER BY(ソート)と、GROUP BYとの違いを学びます。
「OVER、PARTITION BY、ORDER BY」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
ウィンドウ関数とは
ウィンドウ関数は、現在の行に関連する行の集合を対象に値を計算します。GROUP BYのように結果をまとめることはありません。すべての行を保持しながら、集計列も取得できます。
基本例
テーブル全体の注文合計の平均値を、すべての行に表示します。
SELECT id, total,
AVG(total) OVER () AS avg_total
FROM orders;OVER句
OVER (...)句でウィンドウを定義します。空の括弧は「結果セット全体」を意味します。
SELECT id, total,
SUM(total) OVER () AS grand_total
FROM orders;PARTITION BY:ウィンドウをグループ化
GROUP BYと似ていますが、行はまとめられません。
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id) AS user_total
FROM orders;
-- Every order keeps its row; user_total is the same for all of one user's orders.ウィンドウ内のORDER BY
OVER内のORDER BYで、累計などの計算に使う行の順序を定義します。
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id ORDER BY created_at) AS running_total
FROM orders;
-- Running total per user, ordered by date.ウィンドウ関数とGROUP BY
並べて比較してみましょう。
-- GROUP BY: 1 row per user
SELECT user_id, SUM(total) FROM orders GROUP BY user_id;
-- Window: 1 row per order, with user total alongside
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id)
FROM orders;行ごとに異なるフレーム
「フレーム」とは、関数が参照するパーティション内の行の集合です。ORDER BYを指定した場合のデフォルトのフレームは「先頭の行から現在の行まで」です。これによって累計を計算できます。
名前付きウィンドウ
複数の関数で同じウィンドウを共有する場合は、1回だけ名前を付けます。
SELECT id, user_id, total,
SUM(total) OVER w AS running_sum,
AVG(total) OVER w AS running_avg
FROM orders
WINDOW w AS (PARTITION BY user_id ORDER BY created_at);ほとんどの集計関数はウィンドウ関数として使える
COUNT、SUM、AVG、MIN、MAXはすべてウィンドウ上で使用できます。専用のウィンドウ関数には、ROW_NUMBER、RANK、LAG/LEAD、NTILEなどがあります。
ウィンドウ関数はWHEREの後に実行される
論理的な実行順序は、FROM → WHERE → GROUP BY → HAVING → window functions → SELECT → ORDER BY → LIMITです。そのため、WHEREによる絞り込みはウィンドウ関数の計算前に行われます。
パフォーマンスに関する考慮事項
ウィンドウ関数では、ソート(またはハッシュ)が必要です。大きなパーティションでは、(パーティション列、順序列)に対するインデックスによってソート処理を回避できます。
まとめ
ウィンドウ関数は、行ごとに集計値を追加します。
- OVER () = 結果全体
- PARTITION BY = ウィンドウのグループ化
- ウィンドウ内のORDER BY = 累計などの計算を有効化
理解度チェック
SUM(x) OVER (PARTITION BY user_id)は何を計算しますか。
よくある質問
「OVER、PARTITION BY、ORDER BY」レッスンは無料ですか?
はい。「OVER、PARTITION BY、ORDER BY」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「OVER、PARTITION BY、ORDER BY」で何を学びますか?
ウィンドウ関数のモデルを理解します。OVER、PARTITION BY(グループ化)、ORDER BY(ソート)と、GROUP BYとの違いを学びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「OVER、PARTITION BY、ORDER BY」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- OVER、PARTITION BY、ORDER BY
- ROW_NUMBER、RANK、DENSE_RANK
- LAG、LEADと時系列パターン
- 累積合計と移動平均