Menu
Coddy logo textTech

グループごとの上位N件

CoddyのSQLジャーニー「応用」セクションの一部 — レッスン 23/27。

「部署ごとの最高給与の従業員」は、教科書的な例です。その手法は常に、PARTITION BY を指定した ROW_NUMBER() を使い、その後、行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

チャレンジ

簡単

利用可能なテーブルとカラム:

  • <strong>employees</strong>: <strong>id</strong>, <strong>name</strong>, <strong>department</strong>, <strong>salary</strong>

department 内で最も給与の高い従業員を返してください。namedepartmentsalary を出力し、department の順に並べてください。もし1つの部署内で最高給与の従業員が複数いる場合は、id が小さい方の1人のみを返してください。

チートシート

グループごとに上位N行を取得するには、ROW_NUMBER()PARTITION BYと一緒に使用し、その後フィルタリングします:

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
  • 上位3位を取得するには、WHERE rn = 1WHERE rn <= 3に変更します
  • 同順位を許容するには、ROW_NUMBER()RANK()に入れ替えます

自分で試してみよう

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腕試し

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

応用のすべてのレッスン