使用 OVER 子句

已完成

您已瞭解視窗函式需 OVER 子句來建立及操作視窗。 OVER 子句會定義視窗函式所套用的資料列。 這可能是所有資料列或其子集。 它也可以定義視窗函式的資料列順序。

您可以搭配函數使用 OVER 子句,以便計算彙總值,例如移動平均值、累計彙總、累加值或是每組前 N 個結果。

OVER 子句可採用下列引數:

  • PARTITION BY:可將查詢結果集分割成不同部分。
  • ORDER BY:定義結果集資料列的邏輯順序。
  • ROWS/RANGE:指定起點和結束點限制資料行。 這需要 ORDER BY 引數,且其預設值為資料分割的開頭至目前的元素。

如果尚未為 OVER 子句指定任何引數,則視窗函數會套用到整個結果集。

下圖顯示 SELECT、OVER 和 PARTITION BY 之間的關聯性:

顯示 PARTITION BY 如何進一步細分 OVER 子句中定義的資料列之圖表。

PARTITION BY

PARTITION BY 子句會在套用視窗函式之前,將結果集分割成分割區。 若未指定 PARTITION BY,則會將視窗函式套用至查詢的所有資料列。 分割區會使用 FROM 子句提供的其中一個資料行。

排序依據

ORDER BY 可定義每個資料分割內資料列的邏輯順序。 例如 RANK 函式需要排序資料列,以便傳回每個資料列的排名位置。 預設順序為 ASC,但最佳做法是在依運算式的順序之後指定 ASC 或 DESC。 Null 會被視為最低的可能值。

ROWS 或 RANGE 子句

ROW 或 RANGE 引數會設定所運算資料列的開始和結束界限。 ROW 或 RANGE 需要 OVER 子句內的 ORDER BY 子句。

ROWS 子句會限制資料分割內的資料列,方法是指定目前資料列之前或之後的固定資料列數。

RANGE 子句會以邏輯方式限制資料分割內的資料列,方法是指定與目前資料列的值相關的值範圍。

CURRENT ROW

指定在與 ROWS 一起使用時,視窗在目前的資料列開始或結束,或者在與 RANGE 一起使用時則為目前值。 CURRENT ROW 可以指定為開始點和結束點。

BETWEEN AND

與 ROWS 或 RANGE 搭配使用以指定視窗的起點和結束點邊界。