本文介紹了支持的窗口函數。
Window functions提供了跨越與當前查詢行相關的行集執行計算的能力。
內置的窗口函數羅列在通用窗口函數表中。注意,這些函數必須使用窗口函數語法來調用,也就是說,需要一個OVER
子句。
除了這些函數之外,任何內置的或用戶定義的普通聚合(例如非有序集或假設集聚合)都可以作為窗口函數使用。 聚合函數只有在調用之后有一個OVER
子句時才作為窗口函數;否則,它們充當普通的聚合,并為整個集合返回一行。
通用窗口函數
返回其分區內的當前行數,從1開始計數。 |
返回當前行的排名,包含間隔;即對等組中第一行的 |
返回當前行的排名,不包括間隔;這個功能有效地計數對等組。 |
返回當前行的相對排名,即( |
返回累積分布,也就是(當前行之前或對等的分區行數)/(總的分區行數)。取值范圍為1/ |
返回一個從1到參數值的整數,并將分區劃分為盡可能相等的值。 |
返回分區中在當前行之前 |
返回分區中在當前行之后 |
返回在窗口框架的第一行求得的 |
返回在窗口框架的最后一行求得的 |
返回在窗口框架的第 |
在通用窗口函數表中列出的所有函數都依賴于相關窗口定義的ORDER BY
子句指定的排序順序。 僅考慮ORDER BY
列時不能區分的行被稱為是同等行。 定義的這四個排名函數(包括 cume_dist
),對于對等組的所有行的答案相同。
注意first_value
、last_value
和nth_value
只考慮“窗口幀”內的行,它默認情況下包含從分區的開始行直到當前行的最后一個同等行。 這對last_value
可能不會給出有用的結果,有時對nth_value
也一樣。 你可以通過向OVER
子句增加一個合適的幀聲明(RANGE
或GROUPS
)來重定義幀。
當一個聚集函數被用作窗口函數時,它將在當前行的窗口幀內的行上聚集。 一個使用ORDER BY
和默認窗口幀定義的聚集產生一種“運行時求和”類型的行為,這可能是或者不是想要的結果。 為了獲取在整個分區上的聚集,忽略ORDER BY
或者使用ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
。 其它窗口幀聲明可以用來獲得其它的效果。
SQL 標準為lead
、lag
、first_value
、last_value
和nth_value
定義了一個RESPECT NULLS
或IGNORE NULLS
選項。 這在本數據庫中沒有實現:行為總是與標準的默認相同,即RESPECT NULLS
。 同樣,標準中用于nth_value
的FROM FIRST
或FROM LAST
選項沒有實現: 只有支持默認的FROM FIRST
行為(你可以通過反轉ORDER BY
的排序達到FROM LAST
的結果)。