データベーススペシャリスト試験 2019年 午前2 問14
ある電子商取引サイトでは, 会員の属性を柔軟に変更できるように, “会員項目”表で管理することにした。“会員項目”表に対し, 次の条件でSQL文を実行して結果を得る場合, SQL文のaに入れる字句はどれか。ここで, 実線の下線は主キーを, NULLは値がないことを表す。
〔条件〕
(1)同一“会員番号”をもつ複数の行によって, 一人の会員の属性を表す。
(2)新規に追加する行の行番号は, 最後に追加された行の行番号に1を加えた値とする。
(3)同一“会員番号”で同一“項目名”の行が複数ある場合, より大きい行番号の項目値を採用する。

ア:COUNT
イ:DISTINCT
ウ:MAX(正解)
エ:MIN
解説
会員項目表の最新属性抽出SQL文の字句選択【午前2 解説】
要点まとめ
- 結論:最新の属性値を取得するため、行番号の最大値を選ぶので「MAX」が正解です。
- 根拠:同一会員番号・項目名で複数行ある場合、行番号が大きい方が最新の属性値を示すため、最大行番号を抽出します。
- 差がつくポイント:GROUP BYで最大行番号を正しく抽出しないと、最新データが取得できず誤った結果になる点に注意が必要です。
正解の理由
SQL文のサブクエリ部分で、同一「会員番号」「項目名」ごとに最新の行番号を抽出する必要があります。
このとき、最新の行番号は「最大の行番号」であるため、集約関数「MAX」を使うのが適切です。
「MAX(行番号)」を使うことで、最新の属性行だけを対象にし、外側のSELECTでCASE文により属性値を抽出できます。
このとき、最新の行番号は「最大の行番号」であるため、集約関数「MAX」を使うのが適切です。
「MAX(行番号)」を使うことで、最新の属性行だけを対象にし、外側のSELECTでCASE文により属性値を抽出できます。
よくある誤解
「COUNT」や「DISTINCT」は件数や重複排除に使うため、最新の行番号を取得する目的には不適切です。
「MIN」を使うと最も古い行番号が抽出されてしまい、最新データを取得できません。
「MIN」を使うと最も古い行番号が抽出されてしまい、最新データを取得できません。
解法ステップ
- 条件を整理し、最新の属性値は「最大の行番号」に対応することを理解する。
- サブクエリで「会員番号」「項目名」ごとに最新の行番号を抽出する必要があると判断する。
- 集約関数の候補(COUNT, DISTINCT, MAX, MIN)から「最新=最大値」を表す「MAX」を選ぶ。
- 外側のSELECTでCASE文を使い、該当行の属性値を抽出する構造を確認する。
- GROUP BYで会員番号ごとにまとめ、最新の属性値を1行に集約する。
選択肢別の誤答解説ステップ
- ア: COUNT
行番号の件数を数えるため、最新の行番号抽出には使えません。 - イ: DISTINCT
重複排除のためのキーワードであり、集約関数ではないため誤りです。 - ウ: MAX
正解。最大の行番号を抽出し、最新の属性値を取得できます。 - エ: MIN
最小の行番号を抽出するため、最新のデータではなく最古のデータを取得してしまいます。
補足コラム
SQLで最新のレコードを抽出する際は、日時や行番号などの「更新を示す指標」の最大値を取得することが基本です。
CASE文と集約関数を組み合わせることで、複数属性を1行にまとめるピボット処理が可能になります。
また、ウィンドウ関数を使う方法もありますが、基本的な集約関数の理解が重要です。
CASE文と集約関数を組み合わせることで、複数属性を1行にまとめるピボット処理が可能になります。
また、ウィンドウ関数を使う方法もありますが、基本的な集約関数の理解が重要です。
FAQ
Q: なぜ「MAX」を使うと最新の属性値が取れるのですか?
A: 行番号が大きいほど後から追加された行を示すため、最大値を取ることで最新の行を特定できます。
A: 行番号が大きいほど後から追加された行を示すため、最大値を取ることで最新の行を特定できます。
Q: 「DISTINCT」と「GROUP BY」はどう違いますか?
A: DISTINCTは重複行を排除するキーワード、GROUP BYは集約関数と組み合わせてグループ単位で集計するために使います。
A: DISTINCTは重複行を排除するキーワード、GROUP BYは集約関数と組み合わせてグループ単位で集計するために使います。
Q: CASE文はなぜ必要ですか?
A: 複数の属性名を1つのテーブルから列として抽出するため、条件に応じて値を振り分ける役割を果たします。
A: 複数の属性名を1つのテーブルから列として抽出するため、条件に応じて値を振り分ける役割を果たします。
関連キーワード: SQL, 集約関数, MAX関数, CASE文, ピボット, 属性管理, 行番号, 最新データ抽出