<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.foji.io/index.php?action=history&amp;feed=atom&amp;title=Relational_Data_-_Window_Functions</id>
	<title>Relational Data - Window Functions - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://docs.foji.io/index.php?action=history&amp;feed=atom&amp;title=Relational_Data_-_Window_Functions"/>
	<link rel="alternate" type="text/html" href="https://docs.foji.io/index.php?title=Relational_Data_-_Window_Functions&amp;action=history"/>
	<updated>2026-06-13T08:11:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://docs.foji.io/index.php?title=Relational_Data_-_Window_Functions&amp;diff=2431&amp;oldid=prev</id>
		<title>Chris.Hansen: Import ClickHouse Docs: Wed Aug 28 2024 15:06:23 GMT-0400 (Eastern Daylight Time)</title>
		<link rel="alternate" type="text/html" href="https://docs.foji.io/index.php?title=Relational_Data_-_Window_Functions&amp;diff=2431&amp;oldid=prev"/>
		<updated>2024-08-28T19:06:24Z</updated>

		<summary type="html">&lt;p&gt;Import ClickHouse Docs: Wed Aug 28 2024 15:06:23 GMT-0400 (Eastern Daylight Time)&lt;/p&gt;
&lt;a href=&quot;//docs.foji.io/index.php?title=Relational_Data_-_Window_Functions&amp;amp;diff=2431&amp;amp;oldid=2390&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Chris.Hansen</name></author>
	</entry>
	<entry>
		<id>https://docs.foji.io/index.php?title=Relational_Data_-_Window_Functions&amp;diff=2390&amp;oldid=prev</id>
		<title>Chris.Hansen: Import ClickHouse Docs: Wed Aug 28 2024 14:52:53 GMT-0400 (Eastern Daylight Time)</title>
		<link rel="alternate" type="text/html" href="https://docs.foji.io/index.php?title=Relational_Data_-_Window_Functions&amp;diff=2390&amp;oldid=prev"/>
		<updated>2024-08-28T18:52:53Z</updated>

		<summary type="html">&lt;p&gt;Import ClickHouse Docs: Wed Aug 28 2024 14:52:53 GMT-0400 (Eastern Daylight Time)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;UNBOUNDED FOLLOWING (END of the PARTITION)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### Functions&lt;br /&gt;
&lt;br /&gt;
These functions can be used only as a window function.&lt;br /&gt;
&lt;br /&gt;
- [`row_number()`](Relational_Data_-_Window_Functions_-_Row_Number) - Number the current row within its partition starting from 1.&lt;br /&gt;
- [`first_value(x)`](Relational_Data_-_Window_Functions_-_First_Value) - Return the first value evaluated within its ordered frame.&lt;br /&gt;
- [`last_value(x)`](Relational_Data_-_Window_Functions_-_Last_Value) -  Return the last value evaluated within its ordered frame.&lt;br /&gt;
- [`nth_value(x, offset)`](Relational_Data_-_Window_Functions_-_Nth_Value) - Return the first non-NULL value evaluated against the nth row (offset) in its ordered frame.&lt;br /&gt;
- [`rank()`](Relational_Data_-_Window_Functions_-_Rank) - Rank the current row within its partition with gaps.&lt;br /&gt;
- [`dense_rank()`](Relational_Data_-_Window_Functions_-_Dense_Rank) - Rank the current row within its partition without gaps.&lt;br /&gt;
- [`lagInFrame(x)`](Relational_Data_-_Window_Functions_-_Lag_In_Frame) - Return a value evaluated at the row that is at a specified physical offset row before the current row within the ordered frame.&lt;br /&gt;
- [`leadInFrame(x)`](Relational_Data_-_Window_Functions_-_Lead_In_Frame) - Return a value evaluated at the row that is offset rows after the current row within the ordered frame.&lt;br /&gt;
&lt;br /&gt;
## Examples&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s have a look at some examples of how window functions can be used.&lt;br /&gt;
&lt;br /&gt;
### Numbering rows&lt;br /&gt;
&lt;br /&gt;
```sql&lt;br /&gt;
CREATE TABLE salaries&lt;br /&gt;
(&lt;br /&gt;
    `team` String,&lt;br /&gt;
    `player` String,&lt;br /&gt;
    `salary` UInt32,&lt;br /&gt;
    `position` String&lt;br /&gt;
)&lt;br /&gt;
Engine = Memory;&lt;br /&gt;
&lt;br /&gt;
INSERT INTO salaries FORMAT Values&lt;br /&gt;
    (&amp;#039;Port Elizabeth Barbarians&amp;#039;, &amp;#039;Gary Chen&amp;#039;, 195000, &amp;#039;F&amp;#039;),&lt;br /&gt;
    (&amp;#039;New Coreystad Archdukes&amp;#039;, &amp;#039;Charles Juarez&amp;#039;, 190000, &amp;#039;F&amp;#039;),&lt;br /&gt;
    (&amp;#039;Port Elizabeth Barbarians&amp;#039;, &amp;#039;Michael Stanley&amp;#039;, 150000, &amp;#039;D&amp;#039;),&lt;br /&gt;
    (&amp;#039;New Coreystad Archdukes&amp;#039;, &amp;#039;Scott Harrison&amp;#039;, 150000, &amp;#039;D&amp;#039;),&lt;br /&gt;
    (&amp;#039;Port Elizabeth Barbarians&amp;#039;, &amp;#039;Robert George&amp;#039;, 195000, &amp;#039;M&amp;#039;);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT player, salary, &lt;br /&gt;
       row_number() OVER (ORDER BY salary) AS row&lt;br /&gt;
FROM salaries;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;┌─player──────────┬─salary─┬─row─┐&lt;br /&gt;
│ Michael Stanley │ 150000 │   1 │&lt;br /&gt;
│ Scott Harrison  │ 150000 │   2 │&lt;br /&gt;
│ Charles Juarez  │ 190000 │   3 │&lt;br /&gt;
│ Gary Chen       │ 195000 │   4 │&lt;br /&gt;
│ Robert George   │ 195000 │   5 │&lt;br /&gt;
└─────────────────┴────────┴─────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT player, salary, &lt;br /&gt;
       row_number() OVER (ORDER BY salary) AS row,&lt;br /&gt;
       rank() OVER (ORDER BY salary) AS rank,&lt;br /&gt;
       dense_rank() OVER (ORDER BY salary) AS denseRank&lt;br /&gt;
FROM salaries;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;┌─player──────────┬─salary─┬─row─┬─rank─┬─denseRank─┐&lt;br /&gt;
│ Michael Stanley │ 150000 │   1 │    1 │         1 │&lt;br /&gt;
│ Scott Harrison  │ 150000 │   2 │    1 │         1 │&lt;br /&gt;
│ Charles Juarez  │ 190000 │   3 │    3 │         2 │&lt;br /&gt;
│ Gary Chen       │ 195000 │   4 │    4 │         3 │&lt;br /&gt;
│ Robert George   │ 195000 │   5 │    4 │         3 │&lt;br /&gt;
└─────────────────┴────────┴─────┴──────┴───────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;aggregation-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Aggregation functions ===&lt;br /&gt;
&lt;br /&gt;
Compare each player’s salary to the average for their team.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT player, salary, team,&lt;br /&gt;
       avg(salary) OVER (PARTITION BY team) AS teamAvg,&lt;br /&gt;
       salary - teamAvg AS diff&lt;br /&gt;
FROM salaries;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;┌─player──────────┬─salary─┬─team──────────────────────┬─teamAvg─┬───diff─┐&lt;br /&gt;
│ Charles Juarez  │ 190000 │ New Coreystad Archdukes   │  170000 │  20000 │&lt;br /&gt;
│ Scott Harrison  │ 150000 │ New Coreystad Archdukes   │  170000 │ -20000 │&lt;br /&gt;
│ Gary Chen       │ 195000 │ Port Elizabeth Barbarians │  180000 │  15000 │&lt;br /&gt;
│ Michael Stanley │ 150000 │ Port Elizabeth Barbarians │  180000 │ -30000 │&lt;br /&gt;
│ Robert George   │ 195000 │ Port Elizabeth Barbarians │  180000 │  15000 │&lt;br /&gt;
└─────────────────┴────────┴───────────────────────────┴─────────┴────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Compare each player’s salary to the maximum for their team.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT player, salary, team,&lt;br /&gt;
       max(salary) OVER (PARTITION BY team) AS teamAvg,&lt;br /&gt;
       salary - teamAvg AS diff&lt;br /&gt;
FROM salaries;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;┌─player──────────┬─salary─┬─team──────────────────────┬─teamAvg─┬───diff─┐&lt;br /&gt;
│ Charles Juarez  │ 190000 │ New Coreystad Archdukes   │  190000 │      0 │&lt;br /&gt;
│ Scott Harrison  │ 150000 │ New Coreystad Archdukes   │  190000 │ -40000 │&lt;br /&gt;
│ Gary Chen       │ 195000 │ Port Elizabeth Barbarians │  195000 │      0 │&lt;br /&gt;
│ Michael Stanley │ 150000 │ Port Elizabeth Barbarians │  195000 │ -45000 │&lt;br /&gt;
│ Robert George   │ 195000 │ Port Elizabeth Barbarians │  195000 │      0 │&lt;br /&gt;
└─────────────────┴────────┴───────────────────────────┴─────────┴────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;partitioning-by-column&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Partitioning by column ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;CREATE TABLE wf_partition&lt;br /&gt;
(&lt;br /&gt;
    `part_key` UInt64,&lt;br /&gt;
    `value` UInt64,&lt;br /&gt;
    `order` UInt64    &lt;br /&gt;
)&lt;br /&gt;
ENGINE = Memory;&lt;br /&gt;
&lt;br /&gt;
INSERT INTO wf_partition FORMAT Values&lt;br /&gt;
   (1,1,1), (1,2,2), (1,3,3), (2,0,0), (3,0,0);&lt;br /&gt;
&lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER (PARTITION BY part_key) AS frame_values&lt;br /&gt;
FROM wf_partition&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
&lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┐&lt;br /&gt;
│        1 │     1 │     1 │ [1,2,3]      │   &amp;lt;┐   &lt;br /&gt;
│        1 │     2 │     2 │ [1,2,3]      │    │  1-st group&lt;br /&gt;
│        1 │     3 │     3 │ [1,2,3]      │   &amp;lt;┘ &lt;br /&gt;
│        2 │     0 │     0 │ [0]          │   &amp;lt;- 2-nd group&lt;br /&gt;
│        3 │     0 │     0 │ [0]          │   &amp;lt;- 3-d group&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;frame-bounding&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Frame bounding ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;CREATE TABLE wf_frame&lt;br /&gt;
(&lt;br /&gt;
    `part_key` UInt64,&lt;br /&gt;
    `value` UInt64,&lt;br /&gt;
    `order` UInt64&lt;br /&gt;
)&lt;br /&gt;
ENGINE = Memory;&lt;br /&gt;
&lt;br /&gt;
INSERT INTO wf_frame FORMAT Values&lt;br /&gt;
   (1,1,1), (1,2,2), (1,3,3), (1,4,4), (1,5,5);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- Frame is bounded by bounds of a partition (BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)&lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER (&lt;br /&gt;
        PARTITION BY part_key &lt;br /&gt;
        ORDER BY order ASC&lt;br /&gt;
        Rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING&lt;br /&gt;
    ) AS frame_values&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
    &lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┐&lt;br /&gt;
│        1 │     1 │     1 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     2 │     2 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     3 │     3 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     4 │     4 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     5 │     5 │ [1,2,3,4,5]  │&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- short form - no bound expression, no order by&lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER (PARTITION BY part_key) AS frame_values&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┐&lt;br /&gt;
│        1 │     1 │     1 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     2 │     2 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     3 │     3 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     4 │     4 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     5 │     5 │ [1,2,3,4,5]  │&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- frame is bounded by the beginning of a partition and the current row&lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER (&lt;br /&gt;
        PARTITION BY part_key &lt;br /&gt;
        ORDER BY order ASC&lt;br /&gt;
        Rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW&lt;br /&gt;
    ) AS frame_values&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
&lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┐&lt;br /&gt;
│        1 │     1 │     1 │ [1]          │&lt;br /&gt;
│        1 │     2 │     2 │ [1,2]        │&lt;br /&gt;
│        1 │     3 │     3 │ [1,2,3]      │&lt;br /&gt;
│        1 │     4 │     4 │ [1,2,3,4]    │&lt;br /&gt;
│        1 │     5 │     5 │ [1,2,3,4,5]  │&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- short form (frame is bounded by the beginning of a partition and the current row)&lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER (PARTITION BY part_key ORDER BY order ASC) AS frame_values&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┐&lt;br /&gt;
│        1 │     1 │     1 │ [1]          │&lt;br /&gt;
│        1 │     2 │     2 │ [1,2]        │&lt;br /&gt;
│        1 │     3 │     3 │ [1,2,3]      │&lt;br /&gt;
│        1 │     4 │     4 │ [1,2,3,4]    │&lt;br /&gt;
│        1 │     5 │     5 │ [1,2,3,4,5]  │&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- frame is bounded by the beginning of a partition and the current row, but order is backward&lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER (PARTITION BY part_key ORDER BY order DESC) AS frame_values&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┐&lt;br /&gt;
│        1 │     1 │     1 │ [5,4,3,2,1]  │&lt;br /&gt;
│        1 │     2 │     2 │ [5,4,3,2]    │&lt;br /&gt;
│        1 │     3 │     3 │ [5,4,3]      │&lt;br /&gt;
│        1 │     4 │     4 │ [5,4]        │&lt;br /&gt;
│        1 │     5 │     5 │ [5]          │&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- sliding frame - 1 PRECEDING ROW AND CURRENT ROW&lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER (&lt;br /&gt;
        PARTITION BY part_key &lt;br /&gt;
        ORDER BY order ASC&lt;br /&gt;
        Rows BETWEEN 1 PRECEDING AND CURRENT ROW&lt;br /&gt;
    ) AS frame_values&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
&lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┐&lt;br /&gt;
│        1 │     1 │     1 │ [1]          │&lt;br /&gt;
│        1 │     2 │     2 │ [1,2]        │&lt;br /&gt;
│        1 │     3 │     3 │ [2,3]        │&lt;br /&gt;
│        1 │     4 │     4 │ [3,4]        │&lt;br /&gt;
│        1 │     5 │     5 │ [4,5]        │&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- sliding frame - Rows BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING &lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER (&lt;br /&gt;
        PARTITION BY part_key &lt;br /&gt;
        ORDER BY order ASC&lt;br /&gt;
        Rows BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING&lt;br /&gt;
    ) AS frame_values&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┐&lt;br /&gt;
│        1 │     1 │     1 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     2 │     2 │ [1,2,3,4,5]  │&lt;br /&gt;
│        1 │     3 │     3 │ [2,3,4,5]    │&lt;br /&gt;
│        1 │     4 │     4 │ [3,4,5]      │&lt;br /&gt;
│        1 │     5 │     5 │ [4,5]        │&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- row_number does not respect the frame, so rn_1 = rn_2 = rn_3 != rn_4&lt;br /&gt;
SELECT&lt;br /&gt;
    part_key,&lt;br /&gt;
    value,&lt;br /&gt;
    order,&lt;br /&gt;
    groupArray(value) OVER w1 AS frame_values,&lt;br /&gt;
    row_number() OVER w1 AS rn_1,&lt;br /&gt;
    sum(1) OVER w1 AS rn_2,&lt;br /&gt;
    row_number() OVER w2 AS rn_3,&lt;br /&gt;
    sum(1) OVER w2 AS rn_4&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
WINDOW&lt;br /&gt;
    w1 AS (PARTITION BY part_key ORDER BY order DESC),&lt;br /&gt;
    w2 AS (&lt;br /&gt;
        PARTITION BY part_key &lt;br /&gt;
        ORDER BY order DESC &lt;br /&gt;
        Rows BETWEEN 1 PRECEDING AND CURRENT ROW&lt;br /&gt;
    )&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
┌─part_key─┬─value─┬─order─┬─frame_values─┬─rn_1─┬─rn_2─┬─rn_3─┬─rn_4─┐&lt;br /&gt;
│        1 │     1 │     1 │ [5,4,3,2,1]  │    5 │    5 │    5 │    2 │&lt;br /&gt;
│        1 │     2 │     2 │ [5,4,3,2]    │    4 │    4 │    4 │    2 │&lt;br /&gt;
│        1 │     3 │     3 │ [5,4,3]      │    3 │    3 │    3 │    2 │&lt;br /&gt;
│        1 │     4 │     4 │ [5,4]        │    2 │    2 │    2 │    2 │&lt;br /&gt;
│        1 │     5 │     5 │ [5]          │    1 │    1 │    1 │    1 │&lt;br /&gt;
└──────────┴───────┴───────┴──────────────┴──────┴──────┴──────┴──────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- first_value and last_value respect the frame&lt;br /&gt;
SELECT&lt;br /&gt;
    groupArray(value) OVER w1 AS frame_values_1,&lt;br /&gt;
    first_value(value) OVER w1 AS first_value_1,&lt;br /&gt;
    last_value(value) OVER w1 AS last_value_1,&lt;br /&gt;
    groupArray(value) OVER w2 AS frame_values_2,&lt;br /&gt;
    first_value(value) OVER w2 AS first_value_2,&lt;br /&gt;
    last_value(value) OVER w2 AS last_value_2&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
WINDOW&lt;br /&gt;
    w1 AS (PARTITION BY part_key ORDER BY order ASC),&lt;br /&gt;
    w2 AS (PARTITION BY part_key ORDER BY order ASC Rows BETWEEN 1 PRECEDING AND CURRENT ROW)&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC;&lt;br /&gt;
┌─frame_values_1─┬─first_value_1─┬─last_value_1─┬─frame_values_2─┬─first_value_2─┬─last_value_2─┐&lt;br /&gt;
│ [1]            │             1 │            1 │ [1]            │             1 │            1 │&lt;br /&gt;
│ [1,2]          │             1 │            2 │ [1,2]          │             1 │            2 │&lt;br /&gt;
│ [1,2,3]        │             1 │            3 │ [2,3]          │             2 │            3 │&lt;br /&gt;
│ [1,2,3,4]      │             1 │            4 │ [3,4]          │             3 │            4 │&lt;br /&gt;
│ [1,2,3,4,5]    │             1 │            5 │ [4,5]          │             4 │            5 │&lt;br /&gt;
└────────────────┴───────────────┴──────────────┴────────────────┴───────────────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- second value within the frame&lt;br /&gt;
SELECT&lt;br /&gt;
    groupArray(value) OVER w1 AS frame_values_1,&lt;br /&gt;
    nth_value(value, 2) OVER w1 AS second_value&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
WINDOW w1 AS (PARTITION BY part_key ORDER BY order ASC Rows BETWEEN 3 PRECEDING AND CURRENT ROW)&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC&lt;br /&gt;
┌─frame_values_1─┬─second_value─┐&lt;br /&gt;
│ [1]            │            0 │&lt;br /&gt;
│ [1,2]          │            2 │&lt;br /&gt;
│ [1,2,3]        │            2 │&lt;br /&gt;
│ [1,2,3,4]      │            2 │&lt;br /&gt;
│ [2,3,4,5]      │            3 │&lt;br /&gt;
└────────────────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;-- second value within the frame + Null for missing values&lt;br /&gt;
SELECT&lt;br /&gt;
    groupArray(value) OVER w1 AS frame_values_1,&lt;br /&gt;
    nth_value(toNullable(value), 2) OVER w1 AS second_value&lt;br /&gt;
FROM wf_frame&lt;br /&gt;
WINDOW w1 AS (PARTITION BY part_key ORDER BY order ASC Rows BETWEEN 3 PRECEDING AND CURRENT ROW)&lt;br /&gt;
ORDER BY&lt;br /&gt;
    part_key ASC,&lt;br /&gt;
    value ASC&lt;br /&gt;
┌─frame_values_1─┬─second_value─┐&lt;br /&gt;
│ [1]            │         ᴺᵁᴸᴸ │&lt;br /&gt;
│ [1,2]          │            2 │&lt;br /&gt;
│ [1,2,3]        │            2 │&lt;br /&gt;
│ [1,2,3,4]      │            2 │&lt;br /&gt;
│ [2,3,4,5]      │            3 │&lt;br /&gt;
└────────────────┴──────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;real-world-examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Real world examples ==&lt;br /&gt;
&lt;br /&gt;
The following examples solve common real-world problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;maximumtotal-salary-per-department&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Maximum/total salary per department ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;CREATE TABLE employees&lt;br /&gt;
(&lt;br /&gt;
    `department` String,&lt;br /&gt;
    `employee_name` String,&lt;br /&gt;
    `salary` Float&lt;br /&gt;
)&lt;br /&gt;
ENGINE = Memory;&lt;br /&gt;
&lt;br /&gt;
INSERT INTO employees FORMAT Values&lt;br /&gt;
   (&amp;#039;Finance&amp;#039;, &amp;#039;Jonh&amp;#039;, 200),&lt;br /&gt;
   (&amp;#039;Finance&amp;#039;, &amp;#039;Joan&amp;#039;, 210),&lt;br /&gt;
   (&amp;#039;Finance&amp;#039;, &amp;#039;Jean&amp;#039;, 505),&lt;br /&gt;
   (&amp;#039;IT&amp;#039;, &amp;#039;Tim&amp;#039;, 200),&lt;br /&gt;
   (&amp;#039;IT&amp;#039;, &amp;#039;Anna&amp;#039;, 300),&lt;br /&gt;
   (&amp;#039;IT&amp;#039;, &amp;#039;Elen&amp;#039;, 500);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT&lt;br /&gt;
    department,&lt;br /&gt;
    employee_name AS emp,&lt;br /&gt;
    salary,&lt;br /&gt;
    max_salary_per_dep,&lt;br /&gt;
    total_salary_per_dep,&lt;br /&gt;
    round((salary / total_salary_per_dep) * 100, 2) AS `share_per_dep(%)`&lt;br /&gt;
FROM&lt;br /&gt;
(&lt;br /&gt;
    SELECT&lt;br /&gt;
        department,&lt;br /&gt;
        employee_name,&lt;br /&gt;
        salary,&lt;br /&gt;
        max(salary) OVER wndw AS max_salary_per_dep,&lt;br /&gt;
        sum(salary) OVER wndw AS total_salary_per_dep&lt;br /&gt;
    FROM employees&lt;br /&gt;
    WINDOW wndw AS (&lt;br /&gt;
        PARTITION BY department&lt;br /&gt;
        rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING&lt;br /&gt;
    )&lt;br /&gt;
    ORDER BY&lt;br /&gt;
        department ASC,&lt;br /&gt;
        employee_name ASC&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
┌─department─┬─emp──┬─salary─┬─max_salary_per_dep─┬─total_salary_per_dep─┬─share_per_dep(%)─┐&lt;br /&gt;
│ Finance    │ Jean │    505 │                505 │                  915 │            55.19 │&lt;br /&gt;
│ Finance    │ Joan │    210 │                505 │                  915 │            22.95 │&lt;br /&gt;
│ Finance    │ Jonh │    200 │                505 │                  915 │            21.86 │&lt;br /&gt;
│ IT         │ Anna │    300 │                500 │                 1000 │               30 │&lt;br /&gt;
│ IT         │ Elen │    500 │                500 │                 1000 │               50 │&lt;br /&gt;
│ IT         │ Tim  │    200 │                500 │                 1000 │               20 │&lt;br /&gt;
└────────────┴──────┴────────┴────────────────────┴──────────────────────┴──────────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;cumulative-sum&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Cumulative sum ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;CREATE TABLE warehouse&lt;br /&gt;
(&lt;br /&gt;
    `item` String,&lt;br /&gt;
    `ts` DateTime,&lt;br /&gt;
    `value` Float&lt;br /&gt;
)&lt;br /&gt;
ENGINE = Memory&lt;br /&gt;
&lt;br /&gt;
INSERT INTO warehouse VALUES&lt;br /&gt;
    (&amp;#039;sku38&amp;#039;, &amp;#039;2020-01-01&amp;#039;, 9),&lt;br /&gt;
    (&amp;#039;sku38&amp;#039;, &amp;#039;2020-02-01&amp;#039;, 1),&lt;br /&gt;
    (&amp;#039;sku38&amp;#039;, &amp;#039;2020-03-01&amp;#039;, -4),&lt;br /&gt;
    (&amp;#039;sku1&amp;#039;, &amp;#039;2020-01-01&amp;#039;, 1),&lt;br /&gt;
    (&amp;#039;sku1&amp;#039;, &amp;#039;2020-02-01&amp;#039;, 1),&lt;br /&gt;
    (&amp;#039;sku1&amp;#039;, &amp;#039;2020-03-01&amp;#039;, 1);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT&lt;br /&gt;
    item,&lt;br /&gt;
    ts,&lt;br /&gt;
    value,&lt;br /&gt;
    sum(value) OVER (PARTITION BY item ORDER BY ts ASC) AS stock_balance&lt;br /&gt;
FROM warehouse&lt;br /&gt;
ORDER BY&lt;br /&gt;
    item ASC,&lt;br /&gt;
    ts ASC;&lt;br /&gt;
&lt;br /&gt;
┌─item──┬──────────────────ts─┬─value─┬─stock_balance─┐&lt;br /&gt;
│ sku1  │ 2020-01-01 00:00:00 │     1 │             1 │&lt;br /&gt;
│ sku1  │ 2020-02-01 00:00:00 │     1 │             2 │&lt;br /&gt;
│ sku1  │ 2020-03-01 00:00:00 │     1 │             3 │&lt;br /&gt;
│ sku38 │ 2020-01-01 00:00:00 │     9 │             9 │&lt;br /&gt;
│ sku38 │ 2020-02-01 00:00:00 │     1 │            10 │&lt;br /&gt;
│ sku38 │ 2020-03-01 00:00:00 │    -4 │             6 │&lt;br /&gt;
└───────┴─────────────────────┴───────┴───────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;moving-sliding-average-per-3-rows&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Moving / Sliding Average (per 3 rows) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;CREATE TABLE sensors&lt;br /&gt;
(&lt;br /&gt;
    `metric` String,&lt;br /&gt;
    `ts` DateTime,&lt;br /&gt;
    `value` Float&lt;br /&gt;
)&lt;br /&gt;
ENGINE = Memory;&lt;br /&gt;
&lt;br /&gt;
insert into sensors values(&amp;#039;cpu_temp&amp;#039;, &amp;#039;2020-01-01 00:00:00&amp;#039;, 87),&lt;br /&gt;
                          (&amp;#039;cpu_temp&amp;#039;, &amp;#039;2020-01-01 00:00:01&amp;#039;, 77),&lt;br /&gt;
                          (&amp;#039;cpu_temp&amp;#039;, &amp;#039;2020-01-01 00:00:02&amp;#039;, 93),&lt;br /&gt;
                          (&amp;#039;cpu_temp&amp;#039;, &amp;#039;2020-01-01 00:00:03&amp;#039;, 87),&lt;br /&gt;
                          (&amp;#039;cpu_temp&amp;#039;, &amp;#039;2020-01-01 00:00:04&amp;#039;, 87),&lt;br /&gt;
                          (&amp;#039;cpu_temp&amp;#039;, &amp;#039;2020-01-01 00:00:05&amp;#039;, 87),&lt;br /&gt;
                          (&amp;#039;cpu_temp&amp;#039;, &amp;#039;2020-01-01 00:00:06&amp;#039;, 87),&lt;br /&gt;
                          (&amp;#039;cpu_temp&amp;#039;, &amp;#039;2020-01-01 00:00:07&amp;#039;, 87);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT&lt;br /&gt;
    metric,&lt;br /&gt;
    ts,&lt;br /&gt;
    value,&lt;br /&gt;
    avg(value) OVER (&lt;br /&gt;
        PARTITION BY metric &lt;br /&gt;
        ORDER BY ts ASC &lt;br /&gt;
        Rows BETWEEN 2 PRECEDING AND CURRENT ROW&lt;br /&gt;
    ) AS moving_avg_temp&lt;br /&gt;
FROM sensors&lt;br /&gt;
ORDER BY&lt;br /&gt;
    metric ASC,&lt;br /&gt;
    ts ASC;&lt;br /&gt;
&lt;br /&gt;
┌─metric───┬──────────────────ts─┬─value─┬───moving_avg_temp─┐&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:00 │    87 │                87 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:01 │    77 │                82 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:02 │    93 │ 85.66666666666667 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:03 │    87 │ 85.66666666666667 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:04 │    87 │                89 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:05 │    87 │                87 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:06 │    87 │                87 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:07 │    87 │                87 │&lt;br /&gt;
└──────────┴─────────────────────┴───────┴───────────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;moving-sliding-average-per-10-seconds&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Moving / Sliding Average (per 10 seconds) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT&lt;br /&gt;
    metric,&lt;br /&gt;
    ts,&lt;br /&gt;
    value,&lt;br /&gt;
    avg(value) OVER (PARTITION BY metric ORDER BY ts&lt;br /&gt;
      Range BETWEEN 10 PRECEDING AND CURRENT ROW) AS moving_avg_10_seconds_temp&lt;br /&gt;
FROM sensors&lt;br /&gt;
ORDER BY&lt;br /&gt;
    metric ASC,&lt;br /&gt;
    ts ASC;&lt;br /&gt;
    &lt;br /&gt;
┌─metric───┬──────────────────ts─┬─value─┬─moving_avg_10_seconds_temp─┐&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:00:00 │    87 │                         87 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:01:10 │    77 │                         77 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:02:20 │    93 │                         93 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:03:30 │    87 │                         87 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:04:40 │    87 │                         87 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:05:50 │    87 │                         87 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:06:00 │    87 │                         87 │&lt;br /&gt;
│ cpu_temp │ 2020-01-01 00:07:10 │    87 │                         87 │&lt;br /&gt;
└──────────┴─────────────────────┴───────┴────────────────────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;moving-sliding-average-per-10-days&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Moving / Sliding Average (per 10 days) ===&lt;br /&gt;
&lt;br /&gt;
Temperature is stored with second precision, but using &amp;lt;code&amp;gt;Range&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ORDER BY toDate(ts)&amp;lt;/code&amp;gt; we form a frame with the size of 10 units, and because of &amp;lt;code&amp;gt;toDate(ts)&amp;lt;/code&amp;gt; the unit is a day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;CREATE TABLE sensors&lt;br /&gt;
(&lt;br /&gt;
    `metric` String,&lt;br /&gt;
    `ts` DateTime,&lt;br /&gt;
    `value` Float&lt;br /&gt;
)&lt;br /&gt;
ENGINE = Memory;&lt;br /&gt;
&lt;br /&gt;
insert into sensors values(&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-01-01 00:00:00&amp;#039;, 16),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-01-01 12:00:00&amp;#039;, 16),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-01-02 11:00:00&amp;#039;, 9),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-01-02 12:00:00&amp;#039;, 9),                          &lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-02-01 10:00:00&amp;#039;, 10),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-02-01 12:00:00&amp;#039;, 10),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-02-10 12:00:00&amp;#039;, 12),                          &lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-02-10 13:00:00&amp;#039;, 12),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-02-20 12:00:01&amp;#039;, 16),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-03-01 12:00:00&amp;#039;, 16),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-03-01 12:00:00&amp;#039;, 16),&lt;br /&gt;
                          (&amp;#039;ambient_temp&amp;#039;, &amp;#039;2020-03-01 12:00:00&amp;#039;, 16);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT&lt;br /&gt;
    metric,&lt;br /&gt;
    ts,&lt;br /&gt;
    value,&lt;br /&gt;
    round(avg(value) OVER (PARTITION BY metric ORDER BY toDate(ts) &lt;br /&gt;
       Range BETWEEN 10 PRECEDING AND CURRENT ROW),2) AS moving_avg_10_days_temp&lt;br /&gt;
FROM sensors&lt;br /&gt;
ORDER BY&lt;br /&gt;
    metric ASC,&lt;br /&gt;
    ts ASC;&lt;br /&gt;
&lt;br /&gt;
┌─metric───────┬──────────────────ts─┬─value─┬─moving_avg_10_days_temp─┐&lt;br /&gt;
│ ambient_temp │ 2020-01-01 00:00:00 │    16 │                      16 │&lt;br /&gt;
│ ambient_temp │ 2020-01-01 12:00:00 │    16 │                      16 │&lt;br /&gt;
│ ambient_temp │ 2020-01-02 11:00:00 │     9 │                    12.5 │&lt;br /&gt;
│ ambient_temp │ 2020-01-02 12:00:00 │     9 │                    12.5 │&lt;br /&gt;
│ ambient_temp │ 2020-02-01 10:00:00 │    10 │                      10 │&lt;br /&gt;
│ ambient_temp │ 2020-02-01 12:00:00 │    10 │                      10 │&lt;br /&gt;
│ ambient_temp │ 2020-02-10 12:00:00 │    12 │                      11 │&lt;br /&gt;
│ ambient_temp │ 2020-02-10 13:00:00 │    12 │                      11 │&lt;br /&gt;
│ ambient_temp │ 2020-02-20 12:00:01 │    16 │                   13.33 │&lt;br /&gt;
│ ambient_temp │ 2020-03-01 12:00:00 │    16 │                      16 │&lt;br /&gt;
│ ambient_temp │ 2020-03-01 12:00:00 │    16 │                      16 │&lt;br /&gt;
│ ambient_temp │ 2020-03-01 12:00:00 │    16 │                      16 │&lt;br /&gt;
└──────────────┴─────────────────────┴───────┴─────────────────────────┘&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;references&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;github-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== GitHub Issues ===&lt;br /&gt;
&lt;br /&gt;
The roadmap for the initial support of window functions is [https://github.com/ClickHouse/ClickHouse/issues/18097 in this issue].&lt;br /&gt;
&lt;br /&gt;
All GitHub issues related to window functions have the [https://github.com/ClickHouse/ClickHouse/labels/comp-window-functions comp-window-functions] tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tests&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Tests ===&lt;br /&gt;
&lt;br /&gt;
These tests contain the examples of the currently supported grammar:&lt;br /&gt;
&lt;br /&gt;
https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml&lt;br /&gt;
&lt;br /&gt;
https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;postgres-docs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Postgres Docs ===&lt;br /&gt;
&lt;br /&gt;
https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW&lt;br /&gt;
&lt;br /&gt;
https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS&lt;br /&gt;
&lt;br /&gt;
https://www.postgresql.org/docs/devel/functions-window.html&lt;br /&gt;
&lt;br /&gt;
https://www.postgresql.org/docs/devel/tutorial-window.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mysql-docs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== MySQL Docs ===&lt;br /&gt;
&lt;br /&gt;
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html&lt;br /&gt;
&lt;br /&gt;
https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html&lt;br /&gt;
&lt;br /&gt;
https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;related-content&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Related Content ==&lt;br /&gt;
&lt;br /&gt;
* Blog: [https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse Working with time series data in ClickHouse]&lt;br /&gt;
* Blog: [https://clickhouse.com/blog/clickhouse-window-array-functions-git-commits Window and array functions for Git commit sequences]&lt;br /&gt;
* Blog: [https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3 Getting Data Into ClickHouse - Part 3 - Using S3]&lt;br /&gt;
[[Category:Relational_Data]]&lt;/div&gt;</summary>
		<author><name>Chris.Hansen</name></author>
	</entry>
</feed>