視窗函數 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

視窗函數

通過使用視窗函數,您可以讓您的用户更有效率地創建分析業務查詢。視窗函數對結果集的一個分割區或「視窗」執行運算,然後針對該視窗中的每一列傳回一個值。反之,非視窗函數對結果集的每一列執行計算。不同於彙總結果列的群組函數,資料表表達式中所有的列都保留。

傳回的值是使用該視窗中列集的值來計算。對於資料表中的每一列,視窗會定義用於計算其他屬性的列集。視窗是以視窗規格 (OVER 子句) 並根據三個主要概念來定義:

  • 視窗分割,其會形成列群組 (PARTITION 子句)

  • 視窗排序,定義每一個分割區內列的順序或序列 (ORDER BY 子句)

  • 視窗框,相對於每一列來定義,以進一步限制列組 (ROWS 規格)

視窗函數是查詢中最後執行的一組運算 (最後的 ORDER BY 子句除外)。所有聯結和所有 WHERE、GROUP BY 及 HAVING 子句都在視窗函數處理之前完成。因此,視窗函數只能出現在 select 清單或 ORDER BY 子句中。您可以在單一查詢中使用多個視窗函數,具有不同的窗框子句。您也可以在其他標量表達式中使用視窗函數,例如 CASE。

Amazon Redshift 支援兩種視窗函數:彙總和排名。

以下是支援的彙總函數:

  • AVG

  • COUNT

  • CUME_DIST

  • FIRST_VALUE

  • LAG

  • LAST_VALUE

  • LEAD

  • MAX

  • MEDIAN

  • MIN

  • NTH_VALUE

  • PERCENTILE_CONT

  • PERCENTILE_DISC

  • RATIO_TO_REPORT

  • STDDEV_POP

  • STDDEV_SAMP (STDDEV 的同義詞)

  • SUM

  • VAR_POP

  • VAR_SAMP (VARIANCE 的同義詞)

以下是支援的排名函數:

  • DENSE_RANK

  • NTILE

  • PERCENT_RANK

  • RANK

  • ROW_NUMBER

窗口函數概述示例

您可以在下面找到演示如何使用視窗函數的概觀示例。您還可以找到具體的代碼示例,每個函數描述。

某些視窗函數範例使用名為 WINSALES 的資料表,此資料表包含 11 列,如下所示。

SALESID DATEID SELLERID BUYERID QTY QTY_SHIPPED
30001 8/2/2003 3 B 10 10
10001 12/24/2003 1 C 10 10
10005 12/24/2003 1 A 30
40001 1/9/2004 4 A 40
10006 1/18/2004 1 C 10
20001 2/12/2004 2 B 20 20
40005 2/12/2004 4 A 10 10
20002 2/16/2004 2 C 20 20
30003 4/18/2004 3 B 15
30004 4/18/2004 3 B 20
30007 9/7/2004 3 C 30

下列指令碼建立並填入範例 WINSALES 資料表。

create table winsales( salesid int, dateid date, sellerid int, buyerid char(10), qty int, qty_shipped int); insert into winsales values (30001, '8/2/2003', 3, 'b', 10, 10), (10001, '12/24/2003', 1, 'c', 10, 10), (10005, '12/24/2003', 1, 'a', 30, null), (40001, '1/9/2004', 4, 'a', 40, null), (10006, '1/18/2004', 1, 'c', 10, null), (20001, '2/12/2004', 2, 'b', 20, 20), (40005, '2/12/2004', 4, 'a', 10, 10), (20002, '2/16/2004', 2, 'c', 20, 20), (30003, '4/18/2004', 3, 'b', 15, null), (30004, '4/18/2004', 3, 'b', 20, null), (30007, '9/7/2004', 3, 'c', 30, null);