ROW_NUMBER / RANK / DENSE_RANK
Оконные функции нумерации строк. Различаются поведением при одинаковых значениях.
ROW_NUMBER() OVER ([PARTITION BY col] ORDER BY col) RANK() OVER (...) DENSE_RANK() OVER (...)
Объяснение
Пример
-- Топ-3 сотрудника по зарплате в каждом отделе
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn
FROM employees
)
SELECT * FROM ranked WHERE rn <= 3;Связанные термины
Анекдоты по теме
FIRST_VALUE и LAST_VALUE: — FIRST_VALUE(price) OVER (PARTITION BY product ORDER BY date) — первая цена продукта. — LAST_VALUE(price) OVER (...) — осторожно! По умолчанию frame заканчивается на текущей строке. — Чтобы получить реально последнее значение: ...OVER (PARTITION BY product ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
— Какая оконная функция самая печальная? — LAG(). Потому что она всегда оглядывается на прошлое и никогда не смотрит вперёд.
RANK() и DENSE_RANK() поспорили о справедливости. RANK(): — Если двое на первом месте, следующий — третий. DENSE_RANK(): — Если двое на первом месте, следующий — второй. ROW_NUMBER(): — Мне всё равно. Каждый получает уникальный номер.