窗口函數相關的窗口幀(window frame)的概念及與over句中order by語句對窗口幀的影響

版權聲明:轉載請註明作者(獨孤尚良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——著

發佈了143 篇原創文章 · 獲贊 57 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章