“成績”表に対して,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
正答2
解説
正解は2です。
SQL文1と同じ結果になるよう、ウィンドウ関数ROW_NUMBERの指定を選ぶ問題です。
SQL文1は、学生番号ごとに最小の実施回(初回)を求め、その行だけを取り出しています。
成績表では、S01は実施回1(70点)、S02は2(85点)、S03は3(83点)、S04は6(100点)が初回です。
SQL文2では、番号が1の行を取り出すので、学生ごとに実施回の昇順で番号を振る必要があります。
【選択肢別解説】
1:× PARTITION BYがないと、全行を通して一つの連番になります。
番号1はS01の実施回1の行だけになり、4人分は得られません。
2:○ 学生番号ごとに区切り、実施回の昇順で番号を振れば、各学生の初回の行が番号1になります。
SQL文1と同じ4行が得られます。
3:× 得点の昇順だと、S02は82点の実施回5、S03は78点の実施回9が番号1になります。
初回の行とは一致しません。
4:× 得点の降順だと、S01は80点の実施回7、S03は90点の実施回12が番号1になります。
初回の行とは一致しません。
【ポイント】
ROW_NUMBER() OVER (PARTITION BY 列 ORDER BY 列)は、グループごとに並べて連番を振る書き方です。
番号1を取り出せば、グループごとの先頭行を抽出できます。