応用情報技術者試験 令和6年秋 午前問30 解説付き過去問
問題
"成績"表に対して、SQL文1と同一の結果を得るために、SQL文2のaに入れる字句はどれか。

〔SQL文1〕
〔SQL文2〕

SELECT R1.学生番号、R1.実施回、R1.得点 FROM 成績 R1
INNER JOIN
(SELECT 学生番号、MIN(実施回) AS 初回 FROM 成績 GROUP BY 学生番号) R2
ON R1.学生番号=R2.学生番号
AND R1.実施回=R2.初回
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
FROM (SELECT 学生番号、実施回、得点、ROW_NUMBER() OVER(a) AS 番号 FROM 成績) R1
WHERE R1.番号=1
正解
解説
SQL文1の処理内容を理解するために、まず実行の流れを確認する。
- 副問合せ(R2)を作成
・ 「成績」表から各学生ごとの最も小さい実施回(初回)を求める。 - 成績表(R1)と副問合せ(R2)を結合
・ 学生番号と初回の実施回をキーに結合することで、各学生の初回の得点を取得する。
- 「ROW_NUMBER()」 を使用して行番号を付与
・ OVER句を使って、各学生ごとに行番号を割り振る。 - データのグループ化
・「PARTITION BY 学生番号」 を指定することで、各学生ごとにデータを分割する。 - 並び順を指定
・ ORDER BY句を使い、各学生のデータを「最も早い実施回」順に並べる。
・ 実施回の昇順で並べることで、初回のデータが 「ROW_NUMBER() = 1」 になる。 - 初回のデータのみ取得
・ 「WHERE R1.番号 = 1」 によって、各学生の初回の得点のみを選択する。