令和5年度 秋期 午前Ⅱ 問9
データ操作
ウィンドウ関数に関する問題
“成績”表から,クラスごとに得点の高い順に個人を順位付けした結果を求めるSQL文の,aに入れる字句はどれか。
成績
| 氏名 | クラス | 得点 |
|---|---|---|
| 情報太郎 | A | 80 |
| 情報次郎 | A | 63 |
| 情報花子 | B | 70 |
| 情報桜子 | B | 92 |
| 情報三郎 | A | 78 |
〔結果〕
| 氏名 | クラス | 得点 | 順位 |
|---|---|---|---|
| 情報太郎 | A | 80 | 1 |
| 情報三郎 | A | 78 | 2 |
| 情報次郎 | A | 63 | 3 |
| 情報桜子 | B | 92 | 1 |
| 情報花子 | B | 70 | 2 |
〔SQL文〕
SELECT 氏名, クラス, 得点,
[ a ]() OVER (PARTITION BY クラス ORDER BY 得点 DESC) 順位
FROM 成績- アCUME_DIST
- イMAX
- ウPERCENT_RANK
- エRANK
答えと解説を見る
✓ これが正解エRANK
解説
クラス内で得点の高い順に1、2、3と順位を付けるのは RANK です。
このSQL文は、PARTITION BY クラスでクラスごとに区切り、ORDER BY 得点 DESC で得点の高い順に並べたうえで、関数を各行に適用するウィンドウ関数の形です。結果の表を見ると、クラスAは80点が1、78点が2、63点が3、クラスBは92点が1、70点が2という整数の順位が付いています。並び順に従って1から順位を返すのは RANK 関数です。同じ得点が並んだ場合は同じ順位になり、その次の順位は人数分飛びます。見分ける軸は、結果の列に入っている値が順位の整数か、割合を表す小数か、最大値かです。結果の表の値を一つ選んで、各関数で計算するとどうなるかを当てはめると確実に区別できます。
ほかの選択肢はなぜ違うのか
- アCUME_DIST:CUME_DIST は、区画内の並び順でその行までに並ぶ行(同じ値の行を含む)の割合を、0 より大きく 1 以下の値で返します。クラスAなら80点が 1/3、78点が 2/3、63点が 1 となり、結果の表の 1、2、3 という順位にはなりません。
- イMAX:MAX は、指定した列の最大値を返す集約関数で、順位は返しません。そもそも列を引数に取る関数なので、この SQL 文のように空の括弧で使う形には合わず、結果の表の順位も作れません。
- ウPERCENT_RANK:PERCENT_RANK は、順位から 1 を引いて区画の行数から 1 を引いた数で割った値を返します。クラスAなら 80点が 0、78点が 0.5、63点が 1 となり、結果の表の整数の順位とは違います。
出典:令和5年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問9
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)