Aggregate Functions as Window Functions
All aggregate functions — including FILTER
clause — can be used as window functions, by adding the OVER
clause.
Imagine a table EMPLOYEE
with columns ID
, NAME
and SALARY
, and the need to show each employee with their respective salary and the percentage of their salary over the payroll.
A normal query could achieve this, as follows:
select
id,
department,
salary,
salary / (select sum(salary) from employee) portion
from employee
order by id;
id department salary portion
-- ---------- ------ ----------
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
The query is repetitive and lengthy to run, especially if EMPLOYEE
happens to be a complex view.
The same query could be specified in a much faster and more elegant way using a window function:
select
id,
department,
salary,
salary / sum(salary) OVER () portion
from employee
order by id;
Here, sum(salary) over ()
is computed with the sum of all SALARY
from the query (the EMPLOYEE
table).