💻 Примеры
⚡ Кратко: примеры
- Пример 1 — общее количество строк без
PARTITION BY. - Пример 2 — количество сотрудников в отделе через
PARTITION BY. - Пример 3 — сортировка внутри окна для накопительного результата.
Пример 1. Окно без PARTITION BY
Выводим всех сотрудников и общее число сотрудников в компании. Окно охватывает все строки.
SELECT
employee_id,
first_name,
last_name,
COUNT(*) OVER () AS total_employees
FROM employees;
Пример 2. PARTITION BY по отделу
Для каждого сотрудника показываем количество сотрудников в его отделе. Строки не сворачиваются.
SELECT
employee_id,
first_name,
last_name,
department_id,
COUNT(*) OVER (PARTITION BY department_id) AS employees_in_department
FROM employees;
Пример 3. PARTITION BY + ORDER BY в OVER
Для каждого отдела считаем накопительную сумму зарплат по возрастанию зарплаты. Порядок в окне важен.
SELECT
employee_id,
department_id,
salary,
SUM(salary) OVER (
PARTITION BY department_id
ORDER BY salary ASC
) AS running_total
FROM employees;
Пример 4. Сравнение с GROUP BY
GROUP BY возвращает одну строку на отдел:
SELECT
department_id,
COUNT(*) AS employees_in_department,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
Оконная функция сохраняет все строки и добавляет результат как столбец:
SELECT
employee_id,
first_name,
department_id,
COUNT(*) OVER (PARTITION BY department_id) AS employees_in_department,
AVG(salary) OVER (PARTITION BY department_id) AS avg_salary
FROM employees;
ℹ️ Конкретные оконные функции (RANK, LEAD, LAG, ROW_NUMBER и др.) будут разобраны в следующих занятиях.