# Window Functions

Window functions perform calculations across rows of the query result. They run after the `HAVING` clause but before the `ORDER BY` clause. Invoking a window function requires special syntax using the `OVER` clause to specify the window. A window has three components:

• The partition specification, which separates the input rows into different partitions. This is analogous to how the `GROUP BY` clause separates rows into different groups for aggregate functions.
• The ordering specification, which determines the order in which input rows will be processed by the window function.
• The window frame, which specifies a sliding window of rows to be processed by the function for a given row. If the frame is not specified, it defaults to `RANGE UNBOUNDED PRECEDING`, which is the same as `RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`. This frame contains all rows from the start of the partition up to the last peer of the current row.

For example, the following query ranks orders for each clerk by price:

``````SELECT orderkey, clerk, totalprice,
rank() OVER (PARTITION BY clerk
ORDER BY totalprice DESC) AS rnk
FROM orders
ORDER BY clerk, rnk
``````

## Aggregate Functions

All `aggregate` can be used as window functions by adding the `OVER` clause. The aggregate function is computed for each row over the rows within the current row's window frame.

For example, the following query produces a rolling sum of order prices by day for each clerk:

``````SELECT clerk, orderdate, orderkey, totalprice,
sum(totalprice) OVER (PARTITION BY clerk
ORDER BY orderdate) AS rolling_sum
FROM orders
ORDER BY clerk, orderdate, orderkey
``````

## Ranking Functions

cume_dist() -> bigint

Returns the cumulative distribution of a value in a group of values. The result is the number of rows preceding or peer with the row in the window ordering of the window partition divided by the total number of rows in the window partition. Thus, any tie values in the ordering will evaluate to the same distribution value.

dense_rank() -> bigint

Returns the rank of a value in a group of values. This is similar to `rank`, except that tie values do not produce gaps in the sequence.

ntile(n) -> bigint

Divides the rows for each window partition into `n` buckets ranging from `1` to at most `n`. Bucket values will differ by at most `1`. If the number of rows in the partition does not divide evenly into the number of buckets, then the remainder values are distributed one per bucket, starting with the first bucket.

For example, with `6` rows and `4` buckets, the bucket values would be as follows: `1` `1` `2` `2` `3` `4`

percent_rank() -> double

Returns the percentage ranking of a value in group of values. The result is `(r - 1) / (n - 1)` where `r` is the `rank` of the row and `n` is the total number of rows in the window partition.

rank() -> bigint

Returns the rank of a value in a group of values. The rank is one plus the number of rows preceding the row that are not peer with the row.

Thus, tie values in the ordering will produce gaps in the sequence. The ranking is performed for each window partition.

row_number() -> bigint

Returns a unique, sequential number for each row, starting with one, according to the ordering of rows within the window partition.

## Value Functions

first_value(x) -> [same as input]

Returns the first value of the window.

last_value(x) -> [same as input]

Returns the last value of the window.

nth_value(x, offset) -> [same as input]

Returns the value at the specified offset from beginning the window. Offsets start at `1`. The offset can be any scalar expression. If the offset is null or greater than the number of values in the window, null is returned. It is an error for the offset to be zero or negative.

lead(x[, offset [, default_value]]) -> [same as input]

Returns the value at `offset` rows after the current row in the window. Offsets start at `0`, which is the current row. The offset can be any scalar expression. The default `offset` is `1`. If the offset is null or larger than the window, the `default_value` is returned, or if it is not specified `null` is returned.

lag(x[, offset [, default_value]]) -> [same as input]

Returns the value at `offset` rows before the current row in the window Offsets start at `0`, which is the current row. The offset can be any scalar expression. The default `offset` is `1`. If the offset is null or larger than the window, the `default_value` is returned, or if it is not specified `null` is returned.

## 有奖捉虫

0/500

### 存在的问题

● 拼写，格式，无效链接等错误；

● 技术原理、功能、规格等描述和软件不一致，存在错误；

● 原理图、架构图等存在错误；

● 版本号不匹配：文档版本或内容描述和实际软件不一致；

● 对重要数据或系统存在风险的操作，缺少安全提示；

● 排版不美观，影响阅读；

● 描述存在歧义；

● 图形、表格、文字等晦涩难懂；

● 逻辑不清晰，该分类、分项、分步骤的没有给出；

● 很难通过搜索引擎，openLooKeng官网，相关博客找到所需内容；

● 命令、命令参数等错误；

● 命令无法执行或无法完成对应功能；

● 关键步骤错误或缺失，无法指导用户完成任务，比如安装、配置、部署等；

● 逻辑不清晰，该分类、分项、分步骤的没有给出

● 图形、表格、文字等晦涩难懂

● 缺少必要的前提条件、注意事项等；

● 描述存在歧义

0/500