同じ結果となるSQL文|科目A-1(応用情報技術者) 令和6年 秋期午前試験 問30
出典:令和6年秋期 午前 問30
分野:データベース / データ操作
"成績"表に対して,SQL文1と同一の結果を得るために,SQL文2のaに入れる字句はどれか。
成績
〔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
| 学生番号 | 実施回 | 得点 |
| S01 | 1 | 70 |
| S01 | 7 | 80 |
| S02 | 2 | 85 |
| S02 | 5 | 82 |
| S03 | 3 | 83 |
| S03 | 9 | 78 |
| S03 | 12 | 90 |
| S04 | 6 | 100 |
- ア:ORDER BY 学生番号,実施回
- イ:PARTITION BY 学生番号 ORDER BY 実施回
- ウ:PARTITION BY 学生番号 ORDER BY 得点 ASC
- エ:PARTITION BY 学生番号 ORDER BY 得点 DESC
TSUNAGARU-ADVICE
まず押さえたいこと
SQL文1では、学生番号ごとに最小の実施回を求め、その実施回に対応する成績を取り出しています。SQL文2でも同じ結果にするには、学生番号ごとにグループを分け、実施回が小さい順に番号を付ければよいと分かります。
迷ったときの判断軸
ROW_NUMBER()では、PARTITION BYでグループ分けし、ORDER BYでそのグループ内の並び順を決めます。したがって、PARTITION BY 学生番号 ORDER BY 実施回とすれば、各学生の最初の受験回に番号1が付きます。
科目Bにつなげるために
特にプロフェッショナルデジタルスキル(データ・AI)試験合格を目指す方は、GROUP BYで集約する方法と、ウィンドウ関数で順位を付ける方法の違いを押さえましょう。ROW_NUMBER()、RANK()、PARTITION BY、ORDER BYの役割を整理しておくと、SQLによる分析問題に対応しやすくなります。

SQL文1では、学生番号ごとにMIN(実施回)を求め、その学生が最初に受けた実施回の成績だけを取り出しています。
SQL文2でも同じ結果にするには、ROW_NUMBER()を使って、学生番号ごとにグループ分けし、その中で実施回の小さい順に1、2、3……と番号を付ける必要があります。
そのため、aには次の指定が入ります。
PARTITION BY 学生番号 ORDER BY 実施回
例えばS03の場合、実施回は3、9、12なので、実施回3に番号1、実施回9に番号2、実施回12に番号3が付けられます。最後にWHERE R1.番号 = 1とすることで、各学生の最初の実施回だけを取得できます。
したがって、イが適切です。
❌他選択肢が誤りの理由ア:ORDER BY 学生番号,実施回
⇒学生番号ごとに分割するPARTITION BYがないため、表全体に対して通し番号が付けられます。WHERE R1.番号 = 1では、全体の先頭1行しか取得できません。
ウ:PARTITION BY 学生番号 ORDER BY 得点 ASC
⇒学生番号ごとに得点の低い順で番号が付くため、各学生の最低得点の行が取得されます。SQL文1が求めている最初の実施回とは一致しません。
エ:PARTITION BY 学生番号 ORDER BY 得点 DESC
⇒学生番号ごとに得点の高い順で番号が付くため、各学生の最高得点の行が取得されます。SQL文1が求めている最初の実施回とは一致しません。