Standard window functions
ClickHouse supports the standard SQL grammar for windows and window functions. The table below shows which features are currently supported:Syntax
PARTITION BY- defines how to break a resultset into groups.ORDER BY- defines how to order rows inside the group during calculation aggregate_function.ROWS,RANGE, orGROUPS- defines bounds of a frame, aggregate_function is calculated within a frame.ROWScounts physical rows,RANGEcountsORDER BYvalues, andGROUPScounts peer groups (rows equal on theORDER BYkey).WINDOW- allows multiple expressions to use the same window definition.
Functions usable only as window functions
The following functions can only be used as window functions. Most are standard SQL functions;lagInFrame, leadInFrame, and nonNegativeDerivative are ClickHouse extensions.
Examples
Let’s have a look at some examples of how window functions can be used.Numbering rows
Aggregation functions
Compare each player’s salary to the average for their team.Partitioning by column
Frame bounding
GROUPS frame
AGROUPS frame counts whole peer groups — sets of rows that are equal on the ORDER BY key — rather than physical rows (ROWS) or ORDER BY values (RANGE). N PRECEDING and N FOLLOWING count N peer groups before and after the current row’s peer group, and an included peer group always contributes all of its rows.
The query below applies the same 1 PRECEDING AND 1 FOLLOWING bounds as a ROWS, a RANGE, and a GROUPS frame. The order column contains duplicate and non-consecutive values, so the three modes cover different rows:
ROWScounts physical rows, so the frame is at most three adjacent rows: the current row plus one on each side.RANGEcountsordervalues, so1 PRECEDINGand1 FOLLOWINGcover rows whoseorderis within 1 of the current row’s. With gaps of 10, no neighbouring row qualifies, so the frame holds only the rows that share the currentorder.GROUPScounts peer groups, so1 PRECEDINGand1 FOLLOWINGalways include the adjacent groups in full, whatever the gaps betweenordervalues.
Real world examples
The following examples solve common real-world problems.Maximum/total salary per department
Cumulative sum
Moving / sliding average (per 3 rows)
Moving / sliding average (per 10 seconds)
Moving / sliding average (per 10 days)
Temperature is stored with second precision, but usingRange and ORDER BY toDate(ts) we form a frame with the size of 10 units, and because of toDate(ts) the unit is a day.