グループごとのTop-N
CoddyのSQLジャーニー「応用」セクションの一部。レッスン 23/27。
「Highest-paid employee per department」は教科書的な例です。定石は常に ROW_NUMBER() と PARTITION BY を使い、その後で行番号が 1 の行に絞り込むことです。
WITH ranked AS (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1トップ1ではなくトップ3が必要ですか?WHERE rn = 1をWHERE rn <= 3に変更します。トップで同順位を許可しますか?ROW_NUMBER()をRANK()に置き換えます。
チャレンジ
簡単利用可能なテーブルと列:
employees:id、name、department、salary
各 department で最も給与の高い従業員を返してください。name、department、salary を出力し、department の順に並べてください。ある department 内で最高給与の従業員が2人以上同額の場合は、1人だけ返してください。その中で id が最も小さい従業員を返します。
自分で試してみよう
WITH ranked AS (
-- ROW_NUMBER() OVER (PARTITION BY department ORDER BY ...)
)
SELECT name, department, salary FROM ranked WHERE rn = 1
ORDER BY department
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
応用のすべてのレッスン
自分で練習してみよう: SQLプレイグラウンド