版權聲明:轉載請註明作者(獨孤尚良dugushangliang)出處:https://blog.csdn.net/dugushangliang/article/details/103953334
每一行的窗口幀是這行所在分區中的行集。比如分區有十行,則某行的窗口幀,就是其中的N行的集合,N∈[1,10]。由其概念可知,任一行的窗口幀,必然含有本行,窗口幀內的元素數必然大於等於1,必然小於等於本行所在分區的全部行數。即:某行的窗口幀是本行所在分區所有行元素集的子集。
默認情況下,如果使用ORDER BY
,則幀包括從分區開始到當前行的所有行,以及後續任何與當前行在ORDER BY
子句上相等的行。如果ORDER BY
被忽略,則默認幀包含整個分區中所有的行。
mydb=# select salary from empsalary;
salary
--------
5200
4200
4500
6000
5200
3500
3900
4800
5000
4800
(10 行記錄)
我們結合上面這個表來理解相關概念。
下面是over句中省略order by句的情況。此時每一行的窗口幀都是其所在分區的全部行集,所以每行的sum值都是一樣的。
mydb=# SELECT salary, sum(salary) OVER () FROM empsalary;
salary | sum
--------+-------
5200 | 47100
4200 | 47100
4500 | 47100
6000 | 47100
5200 | 47100
3500 | 47100
3900 | 47100
4800 | 47100
5000 | 47100
4800 | 47100
(10 行記錄)
下面是over句中使用order by句的情況。根據salary字段排序,所以某行的窗口幀是salary值小於等於當前值的所有行的集合。
mydb=# SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary;
salary | sum
--------+-------
3500 | 3500
3900 | 7400
4200 | 11600
4500 | 16100
4800 | 25700
4800 | 25700
5000 | 30700
5200 | 41100
5200 | 41100
6000 | 47100
(10 行記錄)
在OVER
子句中沒有ORDER BY
,窗口幀和分區一樣,而如果缺少PARTITION BY
則和整個表一樣。
獨孤尚良dugushangliang——著