令和6年度 秋期 午前 問30
データベース
SQL文2のaに入れる字句
“成績”表に対して,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〕(a は空欄)
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
答えと解説を見る
✓ これが正解イPARTITION BY 学生番号 ORDER BY 実施回
解説
学生ごとに区切り実施回の順に番号を振ります。
設問は、成績表に対する二つの SQL 文が同じ結果になるように、空欄に入れる字句を選ばせています。一つ目の文は、学生ごとに実施回の最小値を求め、その値と一致する行だけを取り出しています。二つ目の文は ROW_NUMBER で各行に番号を振り、番号が 1 の行だけを残す形です。ここから、空欄に必要な条件は二つに分かれます。番号を振り直す単位を学生ごとにすること、そして実施回の小さいほうから順に並べることです。前者を担うのが PARTITION BY で、ここに学生番号を指定します。後者は並べ替えの指定で、実施回を挙げれば、向きを省いたときの既定である昇順になります。正解は、学生番号で区切って実施回の順に並べる字句です。この二つがそろうと、各学生の最初の実施回の行に番号 1 が付き、一つ目の文と同じ行がそろいます。
ほかの選択肢はなぜ違うのか
- アORDER BY 学生番号,実施回:区切りの指定がなく、表全体を通して番号を振る形です。番号が 1 になるのは全体の先頭の一行だけになるので、学生ごとに一行という結果にはなりません。
- ウPARTITION BY 学生番号 OR…:得点の低いほうから番号を振る形です。最初の回が最低点だった学生では偶然そろいますが、後の回で点を落とした学生ではその回が先頭になり、結果が食い違います。
- エPARTITION BY 学生番号 OR…:得点の高いほうから番号を振る形です。最高点を取った回が先頭になるため、最初の実施回とは別の行が選ばれる学生が出て、一つ目の文の結果とずれます。
出典:令和6年度 秋期 応用情報技術者試験 午前 問30
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)