ウィンドウ関数とは(全体像)
ウィンドウ関数は、データの行を減らさずに、各行に「順位」「連番」「累計」などを付け足せるしくみ。`OVER(...)`という書き方で、どの範囲で計算するかを指定するよー。
身近にたとえると、テストの順位表。点数のリスト(各行)はそのまま残したまま、横に「順位」の列を付け足す感じなのー。
押さえるのは、GROUP BYとは違って行数が減らないことと、RANKとDENSE_RANKの違いだよー。
詳しく:GROUP BYとの違いとRANKの違いだけ覚えれば戦える
ここが記事の心臓部。まず代表的な関数を見ていこーね。
代表的なウィンドウ関数
| 関数 | 役割 |
|---|---|
| ROW_NUMBER | 1・2・3…と連番をふる |
| RANK | 順位(同点だと次の番号が飛ぶ) |
| DENSE_RANK | 順位(同点でも飛ばず連続) |
| LAG/LEAD | 前の行・次の行の値を参照する |
ここで一番のひっかけが「ウィンドウ関数はGROUP BYと同じ」という誤解。GROUP BYはまとめて行数が減るけど、ウィンドウ関数は行数を保ったまま、各行に値を付け足すよー。ここが大きな違いなのー。
もう1つの要点が、RANKとDENSE_RANKの違い。
RANKとDENSE_RANKの違い(同点のとき)
| 関数 | 同点が2つあると次は |
|---|---|
| RANK | 1・1・3(順位が飛ぶ) |
| DENSE_RANK | 1・1・2(飛ばず連続) |
ここで2つめのひっかけが「RANKとDENSE_RANKは同じ」という誤解。RANKは同点のあと順位が飛び、DENSE_RANKは飛ばない。スポーツの順位とクラス分けの違いをイメージするといいよー。
わかりやすく言い換えると
要するに、テストの順位表でイメージするとラクだよー。
①ウィンドウ関数 … 点数のリストはそのまま、横に「順位」の列を付け足す
②GROUP BYとの違い … GROUP BYは行をまとめて減らす、ウィンドウは行を保つ
③RANKとDENSE_RANK … RANKは1・1・3(飛ぶ)、DENSE_RANKは1・1・2(飛ばない)
つまり、「ウィンドウは行を保つ(GROUP BYは減る)」「RANKは飛ぶ・DENSEは飛ばない」、この2点が試験の急所なのー。
試験のツボ
🔴 一番出る:ウィンドウ関数の特徴
①行を減らさずに、各行へ順位や累計などを付け足す
②範囲は`OVER(...)`で指定する(代表はROW_NUMBER・RANK・LAG/LEAD)
🔴 次に出る:GROUP BYとの違い
①GROUP BYはまとめて行数が減る
②ウィンドウ関数は行数を保ったまま値を付け足す
🟡 押さえると安定:RANKとDENSE_RANKの違い
①RANKは同点のあと順位が飛ぶ(1・1・3)
②DENSE_RANKは飛ばず連続(1・1・2)
よくある間違い
①「ウィンドウ関数はGROUP BYと同じで行数が減る」→ ✗ GROUP BYは行数が減るが、ウィンドウ関数は行数を保つ。
②「RANKとDENSE_RANKはまったく同じである」→ ✗ RANKは同点で順位が飛ぶ(1・1・3)、DENSE_RANKは飛ばない(1・1・2)。
③「ウィンドウ関数は行を必ず1行に減らす」→ ✗ 各行はそのまま残し、横に順位や累計を付け足す。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(ウィンドウ関数とは)
ウィンドウ関数に関する次の記述のうち、正しいものはどれか。
- ウィンドウ関数は画面に窓を表示するための機能のことだとされているものである
- ウィンドウ関数はデータを必ず暗号化するための命令のことだとされているものである
- ウィンドウ関数は行を減らさずに、各行へ順位や累計などを付け足すSQLのしくみである
- ウィンドウ関数はデータを必ず3つに分割するための設定のことだとされているものである
解答は 3 だよー。
ウィンドウ関数は、行を減らさずに、各行へ順位や累計などを付け足すSQLのしくみなのー。テストの点数リストはそのまま、横に順位の列を付け足す感じだよー。
選択肢1の「窓を表示」、選択肢2の「暗号化」、選択肢4の「3つに分割」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 窓を表示する機能ではない |
| 2 | ✗ | 暗号化の命令ではない |
| 3 | ✓ | 行を保ち順位などを付け足す |
| 4 | ✗ | 3つに分割する設定ではない |
オリジナル問題2(GROUP BYとの違い)
ウィンドウ関数とGROUP BYに関する次の記述のうち、正しいものはどれか。
- ウィンドウ関数もGROUP BYも、どちらも必ず行数を1行に減らすものだとされている
- GROUP BYはまとめて行数が減るが、ウィンドウ関数は行数を保ったまま値を付け足す
- ウィンドウ関数は行数を減らし、GROUP BYは行数を保つものだとされているものである
- ウィンドウ関数もGROUP BYも画面の色をそろえる機能だとされているものである
解答は 2 だよー。
GROUP BYはまとめて行数が減るけど、ウィンドウ関数は行数を保ったまま値を付け足すのー。ここが2つの大きな違いだよー。
選択肢1の「どちらも1行に減らす」、選択肢3の「役割が逆」、選択肢4の「色をそろえる」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | ウィンドウは行を減らさない |
| 2 | ✓ | GROUP BYは減る・ウィンドウは保つ |
| 3 | ✗ | 役割が逆 |
| 4 | ✗ | 色をそろえる機能ではない |
オリジナル問題3(RANKとDENSE_RANK)
RANKとDENSE_RANKに関する次の記述のうち、正しいものはどれか。
- RANKとDENSE_RANKはまったく同じで、同点のときの順位も同じだとされているものである
- RANKは同点でも順位が飛ばず、DENSE_RANKだけが順位を飛ばすものだとされているものだ
- RANKもDENSE_RANKも画面の明るさを決める設定のことだとされているものである
- RANKは同点のあと順位が飛び、DENSE_RANKは飛ばず連続するという大きな違いがある
解答は 4 だよー。
RANKは同点のあと順位が飛び(1・1・3)、DENSE_RANKは飛ばず連続する(1・1・2)のー。同点の次がどうなるかが違うんだよー。
選択肢1の「まったく同じ」、選択肢2の「RANKとDENSEが逆」、選択肢3の「明るさの設定」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 同点のときの順位が違う |
| 2 | ✗ | 飛ぶのはRANKのほう |
| 3 | ✗ | 明るさの設定ではない |
| 4 | ✓ | RANKは飛ぶ・DENSEは飛ばない |
まとめ
押さえどころ
- 🔴 ウィンドウ関数の特徴 = 行を減らさずに各行へ順位や累計を付け足す。範囲は`OVER(...)`で指定。
- 🔴 GROUP BYとの違い = GROUP BYは行数が減る、ウィンドウ関数は行数を保つ。
- 🟡 RANKとDENSE_RANK = RANKは同点で飛ぶ(1・1・3)、DENSE_RANKは飛ばない(1・1・2)。
次に学ぶ
執筆: SikakuQuest編集部