同じ結果となるSQL文|科目A-1(応用情報技術者) 令和6年 秋期午前試験 問30

出典:令和6年秋期 午前 問30 分野:データベース / データ操作
"成績"表に対して,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
  • ア:ORDER BY 学生番号,実施回
  • イ:PARTITION BY 学生番号 ORDER BY 実施回
  • ウ:PARTITION BY 学生番号 ORDER BY 得点 ASC
  • エ:PARTITION BY 学生番号 ORDER BY 得点 DESC
応用情報技術者
解説

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が求めている最初の実施回とは一致しません。
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による分析問題に対応しやすくなります。