グループごとの上位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 = 1 を WHERE rn <= 3 に変更してください。同順位を許容したい場合は、ROW_NUMBER() を RANK() に入れ替えてください。
チャレンジ
簡単利用可能なテーブルとカラム:
<strong>employees</strong>:<strong>id</strong>,<strong>name</strong>,<strong>department</strong>,<strong>salary</strong>
各 department 内で最も給与の高い従業員を返してください。name、department、salary を出力し、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 = 1をWHERE 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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。