支援的版本:目前 (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.65。請注意,這些函數必須使用視窗函數語法調用,即需要 OVER 子句。

除了這些函數之外,任何內建或使用者定義的普通彙總(即,非排序集或假設集彙總)都可以用作視窗函數;有關內建彙總的列表,請參閱第 9.21 節。彙總函數僅當 OVER 子句跟在呼叫之後時才充當視窗函數;否則,它們充當普通彙總,並為整個集合返回單列。

表 9.65. 通用視窗函數

函數

描述

row_number () → bigint

傳回目前列在其分割區中的編號,從 1 開始計數。

rank () → bigint

傳回目前列的排名,有間隙;也就是說,在其同級群組中第一列的 row_number

dense_rank () → bigint

傳回目前列的排名,沒有間隙;此函數有效地計算同級群組。

percent_rank () → double precision

傳回目前列的相對排名,即 (rank - 1) / (分割區總列數 - 1)。因此,該值範圍從 0 到 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.65中列出的所有函式都取決於相關視窗定義的 ORDER BY 子句指定的排序。僅考慮 ORDER BY 欄位時,不相同的列被稱為同位元素。四個排序函式(包括 cume_dist)的定義是它們為同位元素群組的所有列提供相同的答案。

請注意,first_valuelast_valuenth_value 僅考慮 視窗框架 內的列,預設情況下,視窗框架包含從分割區的開頭到目前列的最後一個同位元素的列。這很可能為 last_value 帶來無用的結果,有時也會為 nth_value 帶來無用的結果。您可以透過將適當的框架規範(RANGEROWSGROUPS)新增到 OVER 子句來重新定義框架。有關框架規範的更多資訊,請參閱第 4.2.8 節

當彙總函式用作視窗函式時,它會彙總目前列的視窗框架內的列。與 ORDER BY 和預設視窗框架定義一起使用的彙總會產生滾動總和類型的行為,這可能不是想要的結果。若要取得整個分割區的彙總,請省略 ORDER BY 或使用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。可以使用其他框架規範來取得其他效果。

注意

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

提交更正

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