In
SQL, a window function or analytic function
is a function which uses values from one or multiple
rows to return a value for each row. (This contrasts with an
aggregate function
In database management, an aggregate function or aggregation function is a function where the values of multiple rows are grouped together to form a single summary value.
Common aggregate functions include:
* Average (i.e., arithmetic mean)
* ...
, which returns a single value for multiple rows.) Window functions have an OVER clause; any function without an OVER clause is not a window function, but rather an aggregate or single-row (scalar) function.
Example
As an example, here is a query which uses a window function to compare the salary of each employee with the average salary of their department (example from the
PostgreSQL documentation):
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
Output:
depname , empno , salary , avg
----------+-------+--------+----------------------
develop , 11 , 5200 , 5020.0000000000000000
develop , 7 , 4200 , 5020.0000000000000000
develop , 9 , 4500 , 5020.0000000000000000
develop , 8 , 6000 , 5020.0000000000000000
develop , 10 , 5200 , 5020.0000000000000000
personnel , 5 , 3500 , 3700.0000000000000000
personnel , 2 , 3900 , 3700.0000000000000000
sales , 3 , 4800 , 4866.6666666666666667
sales , 1 , 5000 , 4866.6666666666666667
sales , 4 , 4800 , 4866.6666666666666667
(10 rows)
The
PARTITION BY
clause groups rows into partitions, and the function is applied to each partition separately. If the
PARTITION BY
clause is omitted (such as if we have an empty
OVER()
clause), then the entire
result set
An SQL result set is a set of rows from a database, as well as metadata about the query such as the column names, and the types and sizes of each column. Depending on the database system
In computing, a database is an organized collection of ...
treated as a single partition.
For this query, the average salary reported would be the average taken over all rows.
Window functions are evaluated after aggregation (after the
GROUP BY
clause and non-window aggregate functions, for example).
Syntax
According to the PostgreSQL documentation, a window function has the syntax of one of the following:
function_name ( xpression [, expression ... ) OVER window_name
function_name ( xpression [, expression ... ) OVER ( window_definition )
function_name ( * ) OVER window_name
function_name ( * ) OVER ( window_definition )
where
window_definition
has syntax:
[ existing_window_name ]
[ PARTITION BY expression [, ...] ]
[ ORDER BY expression [ ASC , DESC , USING operator ] [ NULLS ] [, ...] ]
[ frame_clause ]
frame_clause
has the syntax of one of the following:
frame_start frame_exclusion
A frame is often a structural system that supports other components of a physical construction and/or steel frame that limits the construction's extent.
Frame and FRAME may also refer to:
Physical objects
In building construction
*Framing (con ...
BETWEEN frame_start AND frame_end frame_exclusion
A frame is often a structural system that supports other components of a physical construction and/or steel frame that limits the construction's extent.
Frame and FRAME may also refer to:
Physical objects
In building construction
*Framing (con ...
frame_start
and
frame_end
can be
UNBOUNDED PRECEDING
,
offset PRECEDING
,
CURRENT ROW
,
offset FOLLOWING
, or
UNBOUNDED FOLLOWING
.
frame_exclusion
can be
EXCLUDE CURRENT ROW
,
EXCLUDE GROUP
,
EXCLUDE TIES
, or
EXCLUDE NO OTHERS
.
expression
refers to any expression that does not contain a call to a window function.
Notation:
* Brackets [] indicate optional clauses
* Curly braces indicate a set of different possible options, with each option delimited by a vertical bar ,
Example
Window functions allow access to data in the records right before and after the current record. A window function defines a ''frame'' or ''window'' of rows with a given length around the current row, and performs a calculation across the set of data in the window.
NAME ,
------------
Aaron, <-- Preceding (unbounded)
Andrew,
Amelia,
James,
Jill,
Johnny, <-- 1st preceding row
Michael, <-- Current row
Nick, <-- 1st following row
Ophelia,
Zach, <-- Following (unbounded)
In the above table, the next query extracts for each row the values of a window with one preceding and one following row:
SELECT
LAG(name, 1)
OVER(ORDER BY name) "prev",
name,
LEAD(name, 1)
OVER(ORDER BY name) "next"
FROM people
ORDER BY name
The result query contains the following values:
, PREV , NAME , NEXT ,
, ----------, ----------, ----------,
, (null), Aaron, Andrew,
, Aaron, Andrew, Amelia,
, Andrew, Amelia, James,
, Amelia, James, Jill,
, James, Jill, Johnny,
, Jill, Johnny, Michael,
, Johnny, Michael, Nick,
, Michael, Nick, Ophelia,
, Nick, Ophelia, Zach,
, Ophelia, Zach, (null),
History
Window functions were introduced in
SQL:2003 and had functionality expanded in later specifications.
MySQL
MySQL () is an open-source relational database management system (RDBMS). Its name is a combination of "My", the name of co-founder Michael Widenius's daughter My, and "SQL", the acronym for Structured Query Language. A relational database ...
added support for window functions in version 8 in 2018, and
MariaDB
MariaDB is a community-developed, commercially supported fork of the MySQL relational database management system (RDBMS), intended to remain free and open-source software under the GNU General Public License. Development is led by some of the ori ...
introduced first window functions with version 10.2.
See also
*
Select (SQL)#Limiting result rows
References
{{SQL
Articles with example SQL code
SQL