← К оглавлению занятия

💻 Примеры

⚡ Кратко: примеры

  • Пример 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 и др.) будут разобраны в следующих занятиях.