2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

9.22. 視窗函式 #

視窗函式提供了一種能力,可以在與當前查詢行相關的行集上執行計算。有關此功能的介紹,請參閱第 3.5 節,有關語法細節,請參閱第 4.2.8 節

內建的視窗函式列在表 9.67中。請注意,這些函式必須使用視窗函式語法呼叫,即需要OVER子句。

除了這些函式之外,任何內建的或使用者定義的普通聚合函式(即,不是有序集或假設集聚合函式)都可以用作視窗函式;有關內建聚合函式的列表,請參閱第 9.21 節。聚合函式僅在呼叫後面跟有OVER子句時才作為視窗函式;否則,它們將作為普通聚合函式,併為整個集合返回一行。

表 9.67. 通用視窗函式

函式

描述

row_number () → bigint

返回當前行在其分割槽中的行號,從1開始計數。

rank () → bigint

返回當前行的排名,有間隙;也就是說,是其同級組中第一行的row_number

dense_rank () → bigint

返回當前行的排名,無間隙;此函式有效地計算同級組的數量。

percent_rank () → double precision

返回當前行的相對排名,即(rank - 1)/(分割槽總行數 - 1)。因此,該值範圍為0到1(含)。

cume_dist () → double precision

返回累積分佈,即(小於或等於當前行的分割槽行數)/(分割槽總行數)。因此,該值範圍為1/N到1。

ntile ( num_buckets integer ) → integer

返回一個範圍從1到引數值的整數,將分割槽儘可能平均地劃分。

lag ( value anycompatible [, offset integer [, default anycompatible ]] ) → anycompatible

在分割槽中,返回當前行之前offset行的value值;如果不存在這樣的行,則返回default值(該值必須與value型別相容)。offsetdefault都相對於當前行進行計算。如果省略,offset預設為1,default預設為NULL

lead ( value anycompatible [, offset integer [, default anycompatible ]] ) → anycompatible

在分割槽中,返回當前行之後offset行的value值;如果不存在這樣的行,則返回default值(該值必須與value型別相容)。offsetdefault都相對於當前行進行計算。如果省略,offset預設為1,default預設為NULL

first_value ( value anyelement ) → anyelement

返回視窗幀中第一行的value值。

last_value ( value anyelement ) → anyelement

返回視窗幀中最後一行的value值。

nth_value ( value anyelement, n integer ) → anyelement

返回視窗幀中第n行(從1開始計數)的value值;如果不存在這樣的行,則返回NULL


表 9.67 中列出的所有函式都依賴於與相關視窗定義關聯的ORDER BY子句指定的排序順序。僅考慮ORDER BY列時,不重複的行被稱為同級。四個排名函式(包括cume_dist)的定義方式是,它們對同級組中的所有行給出相同的結果。

請注意,first_valuelast_valuenth_value僅考慮視窗幀中的行,該幀預設包含從分割槽開始到當前行的最後一個同級行的所有行。對於last_value,有時對於nth_value,這可能會給出無用的結果。您可以透過在OVER子句中新增合適的幀規範(RANGEROWSGROUPS)來重新定義幀。有關幀規範的更多資訊,請參閱第 4.2.8 節

當聚合函式用作視窗函式時,它會在當前行的視窗幀內的行上進行聚合。ORDER BY和預設視窗幀定義一起使用的聚合會產生執行總計型別的行為,這可能符合也可能不符合您的預期。要獲得整個分割槽的聚合,請省略ORDER BY或使用ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。其他幀規範可用於獲得其他效果。

注意

SQL標準為leadlagfirst_valuelast_valuenth_value定義了RESPECT NULLSIGNORE NULLS選項。這在PostgreSQL中沒有實現:行為始終與標準的預設值相同,即RESPECT NULLS。同樣,標準的FROM FIRSTFROM LAST選項對於nth_value也沒有實現:僅支援預設的FROM FIRST行為。(您可以[::-end-of-string]透過反轉ORDER BY排序來實現FROM LAST的結果。)

提交更正

如果您在文件中發現任何不正確、與您在使用特定功能時的體驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。