コンテストの制限時間が終了しました。
以降も提出を行うことができますが、順位集計には反映されません。
以降も提出を行うことができますが、順位集計には反映されません。
ソースコード
SELECT
pref.PF_CODE as 都道府県コード
,pref.PF_NAME as 都道府県名
,nation1.NATION_NAME as '1位 国名'
,人数1 as '1位 人数'
,nation2.NATION_NAME as '2位 国名'
,人数2 as '2位 人数'
,nation3.NATION_NAME as '3位 国名'
,人数3 as '3位 人数'
,合計人数
FROM
(
SELECT
PF_CODE
,SUM(CASE WHEN rank = 1 THEN NATION_CODE ELSE 0 END ) as 国コード1
,SUM(CASE WHEN rank = 1 THEN AMT ELSE 0 END ) as 人数1
,SUM(CASE WHEN rank = 2 THEN NATION_CODE ELSE 0 END ) as 国コード2
,SUM(CASE WHEN rank = 2 THEN AMT ELSE 0 END ) as 人数2
,SUM(CASE WHEN rank = 3 THEN NATION_CODE ELSE 0 END ) as 国コード3
,SUM(CASE WHEN rank = 3 THEN AMT ELSE 0 END ) as 人数3
,合計人数
FROM
(
SELECT
PF_CODE
,NATION_CODE
,AMT
,ROW_NUMBER() OVER(PARTITION BY PF_CODE ORDER BY AMT DESC, PF_CODE) as rank
-- 集計した人数が同数の場合は、国籍コードの昇順で順位付け
-- RANK: 同率があった場合順位は同じになり、その次は順位を飛ばす(1,1,3,...)
-- DENSE_RANK: 同率があった場合順位は同じになり、その次は順位を飛ばさない(1,1,2...)
-- → ROW_NUMBER: 同率があっても同じ順位にはならず、順位をカウントする
,SUM(AMT) OVER(PARTITION BY PF_CODE) as 合計人数
FROM
FOREIGNER
WHERE
NATION_CODE != 113 -- 国籍:その他を除外
) as rank_data
WHERE
rank <= 3 -- 3位まで
GROUP BY
PF_CODE
) as best3_amt_by_pref
LEFT JOIN
NATIONALITY nation1 ON nation1.NATION_CODE = best3_amt_by_pref.国コード1
LEFT JOIN
NATIONALITY nation2 ON nation2.NATION_CODE = best3_amt_by_pref.国コード2
LEFT JOIN
NATIONALITY nation3 ON nation3.NATION_CODE = best3_amt_by_pref.国コード3
LEFT JOIN
PREFECTURE pref ON pref.PF_CODE = best3_amt_by_pref.PF_CODE
ORDER BY
合計人数 DESC, 都道府県コード
;
提出情報
提出日時 | 2022/08/12 19:43:34 |
コンテスト | 第1回 SQLコンテスト |
問題 | 外国籍分布 |
受験者 | maori |
状態 (詳細) | AC (Accepted: 正答) |
メモリ使用量 | 79 MB |
メッセージ
テストケース(通過数/総数)
2/2
状態
メモリ使用量
データパターン1
AC
79 MB
データパターン2
AC
77 MB