ウィンドウ関数(ROW_NUMBER・LAG)とは?行を減らさずに各行へ順位や累計を付け足せるSQL

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

ウィンドウ関数とは(全体像)

ウィンドウ関数は、データの行を減らさずに、各行に「順位」「連番」「累計」などを付け足せるしくみ。`OVER(...)`という書き方で、どの範囲で計算するかを指定するよー。

身近にたとえると、テストの順位表。点数のリスト(各行)はそのまま残したまま、横に「順位」の列を付け足す感じなのー。

押さえるのは、GROUP BYとは違って行数が減らないことと、RANKとDENSE_RANKの違いだよー。


詳しく:GROUP BYとの違いとRANKの違いだけ覚えれば戦える

ここが記事の心臓部。まず代表的な関数を見ていこーね。

代表的なウィンドウ関数

関数役割
ROW_NUMBER1・2・3…と連番をふる
RANK順位(同点だと次の番号が飛ぶ)
DENSE_RANK順位(同点でも飛ばず連続)
LAG/LEAD前の行・次の行の値を参照する

ここで一番のひっかけが「ウィンドウ関数はGROUP BYと同じ」という誤解。GROUP BYはまとめて行数が減るけど、ウィンドウ関数は行数を保ったまま、各行に値を付け足すよー。ここが大きな違いなのー。

もう1つの要点が、RANKとDENSE_RANKの違い

RANKとDENSE_RANKの違い(同点のとき)

関数同点が2つあると次は
RANK1・1・3(順位が飛ぶ)
DENSE_RANK1・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(ウィンドウ関数とは)

📝 オリジナル問題 1 ウィンドウ関数とは

ウィンドウ関数に関する次の記述のうち、正しいものはどれか。

  1. ウィンドウ関数は画面に窓を表示するための機能のことだとされているものである
  2. ウィンドウ関数はデータを必ず暗号化するための命令のことだとされているものである
  3. ウィンドウ関数は行を減らさずに、各行へ順位や累計などを付け足すSQLのしくみである
  4. ウィンドウ関数はデータを必ず3つに分割するための設定のことだとされているものである
データスラ
データスラ 解答・解説

解答は 3 だよー。

ウィンドウ関数は、行を減らさずに、各行へ順位や累計などを付け足すSQLのしくみなのー。テストの点数リストはそのまま、横に順位の列を付け足す感じだよー。

選択肢1の「窓を表示」、選択肢2の「暗号化」、選択肢4の「3つに分割」はどれも誤りなのー。

選択肢判定理由
1窓を表示する機能ではない
2暗号化の命令ではない
3行を保ち順位などを付け足す
43つに分割する設定ではない

オリジナル問題2(GROUP BYとの違い)

📝 オリジナル問題 2 GROUP BYとの違い

ウィンドウ関数とGROUP BYに関する次の記述のうち、正しいものはどれか。

  1. ウィンドウ関数もGROUP BYも、どちらも必ず行数を1行に減らすものだとされている
  2. GROUP BYはまとめて行数が減るが、ウィンドウ関数は行数を保ったまま値を付け足す
  3. ウィンドウ関数は行数を減らし、GROUP BYは行数を保つものだとされているものである
  4. ウィンドウ関数もGROUP BYも画面の色をそろえる機能だとされているものである
データスラ
データスラ 解答・解説

解答は 2 だよー。

GROUP BYはまとめて行数が減るけど、ウィンドウ関数は行数を保ったまま値を付け足すのー。ここが2つの大きな違いだよー。

選択肢1の「どちらも1行に減らす」、選択肢3の「役割が逆」、選択肢4の「色をそろえる」はどれも誤りなのー。

選択肢判定理由
1ウィンドウは行を減らさない
2GROUP BYは減る・ウィンドウは保つ
3役割が逆
4色をそろえる機能ではない

オリジナル問題3(RANKとDENSE_RANK)

📝 オリジナル問題 3 RANKとDENSE_RANKの違い

RANKとDENSE_RANKに関する次の記述のうち、正しいものはどれか。

  1. RANKとDENSE_RANKはまったく同じで、同点のときの順位も同じだとされているものである
  2. RANKは同点でも順位が飛ばず、DENSE_RANKだけが順位を飛ばすものだとされているものだ
  3. RANKもDENSE_RANKも画面の明るさを決める設定のことだとされているものである
  4. RANKは同点のあと順位が飛び、DENSE_RANKは飛ばず連続するという大きな違いがある
データスラ
データスラ 解答・解説

解答は 4 だよー。

RANKは同点のあと順位が飛び(1・1・3)DENSE_RANKは飛ばず連続する(1・1・2)のー。同点の次がどうなるかが違うんだよー。

選択肢1の「まったく同じ」、選択肢2の「RANKとDENSEが逆」、選択肢3の「明るさの設定」はどれも誤りなのー。

選択肢判定理由
1同点のときの順位が違う
2飛ぶのはRANKのほう
3明るさの設定ではない
4RANKは飛ぶ・DENSEは飛ばない

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る