Window Functions
Window Functions
Windows functions let you perform calculations across a set of rows that are related to the current row. Some of the calculations that you can do are similar to those that can be done with an aggregate function, but a window function doesn't cause rows to be grouped into a single output - the individual rows are still returned.
Standard Window Functions
ClickHouse supports the standard grammar for defining windows and window functions. The table below indicates whether a feature is currently supported.
Feature | Supported? |
---|---|
ad hoc window specification (count(*) over (partition by id order by time desc) ) | ✅ |
expressions involving window functions, e.g. (count(*) over ()) / 2) | ✅ |
WINDOW clause (select ... from table window w as (partition by id) ) | ✅ |
ROWS frame | ✅ |
RANGE frame | ✅ (the default) |
INTERVAL syntax for DateTime RANGE OFFSET frame | ❌ (specify the number of seconds instead (RANGE works with any numeric type).) |
GROUPS frame | ❌ |
Calculating aggregate functions over a frame (sum(value) over (order by time) ) | ✅ (All aggregate functions are supported) |
rank() , dense_rank() , row_number() | ✅ Alias: denseRank() |
percent_rank() | ✅ Efficiently computes the relative standing of a value within a partition in a dataset. This function effectively replaces the more verbose and computationally intensive manual SQL calculation expressed as ifNull((rank() OVER(PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER(PARTITION BY x) - 1, 0), 0) Alias: percentRank() |
lag/lead(value, offset) | ❌ You can use one of the following workarounds: 1) any(value) over (.... rows between <offset> preceding and <offset> preceding) , or following for lead 2) lagInFrame/leadInFrame , which are analogous, but respect the window frame. To get behavior identical to lag/lead , use rows between unbounded preceding and unbounded following |
ntile(buckets) | ✅ Specify window like, (partition by x order by y rows between unbounded preceding and unrounded following). |
ClickHouse-specific Window Functions
There is also the following ClickHouse specific window function:
nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])
Finds non-negative derivative for given metric_column
by timestamp_column
.
INTERVAL
can be omitted, default is INTERVAL 1 SECOND
.
The computed value is the following for each row:
0
for 1st row,- for row.
Syntax
aggregate_function (column_name)
OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column]
[ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name])
FROM table_name
WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]])
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 or RANGE
- defines bounds of a frame, aggregate_function is calculated within a frame.WINDOW
- allows multiple expressions to use the same window definition.
PARTITION
┌─────────────────┐ <-- UNBOUNDED PRECEDING (BEGINNING of the PARTITION)
│ │
│ │
│=================│ <-- N PRECEDING <─┐
│ N ROWS │ │ F