“成績”表に対して、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】
(SELECT 学生番号, MIN(実施回) AS 初回 FROM 成績
GROUP BY 学生番号) R2
について、学生番号が同じものの中から最小の実施回を“初回”としてデータを取り出すため、得られる表は以下のとおりとなる。
R2
学生番号, 初回
S01, 1
S02, 2
S03, 3
S04, 6
したがってSQL文1は、INNER JOIN により成績表 (R1) と上記の表 (R2) の内部結合、すなわち、学生番号がどちらにもあるデータで、R1の実施回とR2の初回が一致するデータを取り出すため、得られる結果は以下となる。
学生番号, 実施回, 得点
S01, 1, 70
S02, 2, 85
S03, 3, 83
S04, 6, 100
【SQL文2】
SQL文1と同一の結果を得るためには、
SELECT 学生番号, 実施回, 得点,
ROW_NUMBER() OVER ( a ) AS 番号 によって、以下のように実施回順の小さい順 (昇順) に並んでおく必要がある。
R1
学生番号, 実施回, 得点, 番号
S01, 1, 70, 1
S01, 7, 80, 2
S02, 2, 85, 1
S02, 5, 82, 2
S03, 3, 83, 1
S03, 9, 78, 2
S03, 12, 90, 3
S04, 6, 100, 1
したがって、 a には PARTITION BY 学生番号 ORDER BY 実施回 が入る。
この表から、番号が1のデータを取り出すため、得られる結果は以下となる。
学生番号, 実施回, 得点
S01, 1, 70
S02, 2, 85
S03, 3, 83
S04, 6, 100
ア 構文エラーとなる。
イ 正しい。ROW_NUMBER() は、連番を振る関数である。
また、PARTITION BY は列単位で集計する分析関数である。
ウ ORDER BY 得点 ASCは得点の小さい順 (昇順) にソートする。
エ ORDER BY 得点 DESCは得点の大きい順 (降順) にソートする。
問29 | 目次 | 問31 |