SQLのウィンドウ関数ROW_NUMBERとPARTITION BYを用いた順位付け

まず SQL文1 の処理内容を整理します。 SQL文1 は,副問合せ R2 で「学生番号」ごとにグループ化して最小の「実施回」(初回)を求め,元の成績表 R1 と「学生番号」および「実施回=初回」で内部結合しています。これにより,「各学生の初回(実施回が最小の回)の成績行(学生番号,実施回,得点)」を抽出しています。 SQL文2 では,ウィンドウ関数 ROW_NUMBER() OVER (...) を用いて行番号を付与し,外側の WHERE 句で 番号 = 1 の行を抽出しています。 学生ごとに最小の実施回を番号 1 とする連番を付与するためには,次の2つの指定が必要です: 1. 学生ごとにウィンドウ(グループ)を分割して番号をリセットするため,PARTITION BY 学生番号 を指定する。 2. 各学生の中で実施回の昇順(小さい順)に 1 から連番を振るため,ORDER BY 実施回(デフォルトは昇順 ASC)を指定する。 したがって,OVER 句に指定すべき字句  a  は PARTITION BY 学生番号 ORDER BY 実施回 となります。正解はイです。 各選択肢の解説は以下のとおりです。 PARTITION BY が指定されていないため,表全体を通して学生番号・実施回順に単一の連番が振られ,表全体で先頭の1行しか抽出されません。 得点の昇順(最も得点が低い回)に連番が振られるため,初回ではなく最低得点の成績行が抽出されてしまいます。 得点の降順(最も得点が高い回)に連番が振られるため,初回ではなく最高得点の成績行が抽出されてしまいます。 学生番号 実施回 得点 PARTITION BY 学生番号 ORDER BY 実施回 の番号 S01 1 70 1 S01 7 80 2 S02 2 85 1 S02 5 82 2 S03 3 83 1 S03 9 78 2 S03 12 90 3 S04 6 100 1 学生ごとに実施回の小さい順に番号を振るので、番号=1 の行は各学生の初回の成績になり、SQL文1 と同じ結果です。得点順(ウ・エ)では最低点・最高点の行になり、PARTITION BY が無いア では全体で1行しか選ばれません。

“成績”表に対して,SQL文1と同一の結果を得るために,SQL文2の  a  に入れる字句はどれか。

成績

学生番号

実施回

得点

S01

1

70

S01

7

80

S02

2

85

S02

5

82

S03

3

83

S03

9

78

S03

12

90

S04

6

100

〔SQL文1〕 SELECT R1.学生番号, R1.実施回, R1.得点 FROM 成績 R1   INNER JOIN   (SELECT 学生番号, MIN(実施回) AS 初回 FROM 成績     GROUP BY 学生番号) R2   ON R1.学生番号 = R2.学生番号  AND R1.実施回 = R2.初回 〔SQL文2〕 SELECT 学生番号, 実施回, 得点   FROM (SELECT 学生番号, 実施回, 得点, ROW_NUMBER() OVER (  a  ) AS 番号       FROM 成績) R1  WHERE R1.番号 = 1

出典令和6年度 秋期 応用情報技術者試験 午前 問30
ア
ORDER BY 学生番号, 実施回
イ
PARTITION BY 学生番号 ORDER BY 実施回
ウ
PARTITION BY 学生番号 ORDER BY 得点 ASC
エ
PARTITION BY 学生番号 ORDER BY 得点 DESC