HOME

TheInfoList



OR:

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