Menu
Coddy logo textTech

グループごとの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 = 1WHERE rn <= 3に変更します。トップで同順位を許可しますか?ROW_NUMBER()RANK()に置き換えます。

challenge icon

チャレンジ

簡単

利用可能なテーブルと列:

  • employeesidnamedepartmentsalary

department で最も給与の高い従業員を返してください。namedepartmentsalary を出力し、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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

応用のすべてのレッスン

自分で練習してみよう: SQLプレイグラウンド