本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

令和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】
(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