Агрегатные функции
Все агрегатные функции могут быть использованы в качестве оконных функций, при добавлении предложения OVER
.
Допустим, у нас есть таблица EMPLOYEE
со столбцами ID
, NAME
и SALARY
.Нам необходимо показать для каждого сотрудника, соответствующую ему заработную плату и процент от фонда заработной платы.
Простым запросом это решается следующим образом:
select
id,
department,
salary,
salary / (select sum(salary) from employee) percentage
from employee
order by id;
id department salary percentage -- ---------- ------ ---------- 1 R & D 10.00 0.2040 2 SALES 12.00 0.2448 3 SALES 8.00 0.1632 4 R & D 9.00 0.1836 5 R & D 10.00 0.2040
Запрос повторяется и может работать довольно долго, особенно если EMPLOYEE является сложным представлением.
Этот запрос может быть переписан в более быстрой и элегантной форме с использованием оконных функций:
select
id,
department,
salary,
salary / sum(salary) OVER () percentage
from employee
order by id;
Здесь sum(salary) OVER ()
вычисляет сумму всех зарплат из запроса (таблицы сотрудников).