本節說明在數值集合上運算的彙總函式。它們通常與 GROUP BY
子句一起使用,將值分組為子集。
表格 14.29 彙總函式
名稱 | 說明 |
---|---|
AVG() |
傳回引數的平均值 |
BIT_AND() |
傳回位元 AND |
BIT_OR() |
傳回位元 OR |
BIT_XOR() |
傳回位元 XOR |
COUNT() |
傳回傳回的列數計數 |
COUNT(DISTINCT) |
傳回不同值的計數 |
GROUP_CONCAT() |
傳回串連的字串 |
JSON_ARRAYAGG() |
將結果集傳回為單一 JSON 陣列 |
JSON_OBJECTAGG() |
將結果集傳回為單一 JSON 物件 |
MAX() |
傳回最大值 |
MIN() |
傳回最小值 |
STD() |
傳回母體標準差 |
STDDEV() |
傳回母體標準差 |
STDDEV_POP() |
傳回母體標準差 |
STDDEV_SAMP() |
傳回樣本標準差 |
SUM() |
傳回總和 |
VAR_POP() |
傳回母體標準變異數 |
VAR_SAMP() |
傳回樣本變異數 |
VARIANCE() |
傳回母體標準變異數 |
除非另有說明,否則彙總函式會忽略 NULL
值。
如果您在不包含 GROUP BY
子句的陳述式中使用彙總函式,則它相當於對所有列進行分組。如需更多資訊,請參閱 章節 14.19.3,「MySQL 的 GROUP BY 處理」。
大多數彙總函式都可以用作視窗函式。可以這種方式使用的函式在其語法描述中會以 [
表示,代表一個選用的 over_clause
]OVER
子句。 over_clause
在 章節 14.20.2,「視窗函式概念和語法」 中說明,其中還包括有關視窗函式用法的其他資訊。
對於數值引數,變異數和標準差函式會傳回 DOUBLE
值。SUM()
和 AVG()
函式對於精確值引數 (整數或 DECIMAL
) 會傳回 DECIMAL
值,對於近似值引數 (FLOAT
或 DOUBLE
) 會傳回 DOUBLE
值。
SUM()
和 AVG()
彙總函式不適用於時間值。(它們會將值轉換為數字,並捨棄第一個非數字字元之後的所有內容。)若要解決此問題,請轉換為數值單位、執行彙總作業,然後轉換回時間值。範例
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
諸如 SUM()
或 AVG()
等預期會有數值引數的函式會在必要時將引數轉換為數字。對於 SET
或 ENUM
值,轉換作業會導致使用基礎數值。
BIT_AND()
、BIT_OR()
和 BIT_XOR()
彙總函式會執行位元運算。
MySQL 位元函式和運算子允許二進位字串類型引數 (BINARY
、VARBINARY
和 BLOB
類型) 並傳回類似類型的值,這使其能夠接受大於 64 位元的引數並產生傳回值。如需位元運算的引數評估和結果類型的討論,請參閱 章節 14.12,「位元函式和運算子」中的簡介討論。
AVG([DISTINCT]
expr
) [over_clause
]傳回
的平均值。expr
DISTINCT
選項可用來傳回expr
的不同值的平均值。如果沒有符合的列,
AVG()
會回傳NULL
。如果expr
為NULL
,此函數也會回傳NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」;它不能與DISTINCT
一起使用。mysql> SELECT student_name, AVG(test_score) FROM student GROUP BY student_name;
回傳
expr
中所有位元的位元 AND 運算結果。結果的類型取決於函數引數值是以二進位字串還是數字進行評估。
當引數值具有二進位字串類型,且引數不是十六進位文字、位元文字或
NULL
文字時,會進行二進位字串評估。否則會進行數值評估,並將引數值轉換為必要的無符號 64 位元整數。二進位字串評估會產生與引數值長度相同的二進位字串。如果引數值的長度不相等,則會發生
ER_INVALID_BITWISE_OPERANDS_SIZE
錯誤。如果引數大小超過 511 位元組,則會發生ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
錯誤。數值評估會產生一個無符號 64 位元整數。
如果沒有符合的列,
BIT_AND()
會回傳一個中性值(所有位元都設為 1),其長度與引數值相同。NULL
值不會影響結果,除非所有值都是NULL
。在這種情況下,結果會是一個中性值,其長度與引數值相同。有關引數評估和結果類型的詳細資訊,請參閱第 14.12 節「位元函數與運算子」中的介紹性討論。
如果從 mysql 用戶端內呼叫
BIT_AND()
,則二進位字串結果會以十六進位表示法顯示,這取決於--binary-as-hex
的值。有關此選項的更多資訊,請參閱第 6.5.1 節「mysql — MySQL 命令列用戶端」。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。回傳
expr
中所有位元的位元 OR 運算結果。結果的類型取決於函數引數值是以二進位字串還是數字進行評估。
當引數值具有二進位字串類型,且引數不是十六進位文字、位元文字或
NULL
文字時,會進行二進位字串評估。否則會進行數值評估,並將引數值轉換為必要的無符號 64 位元整數。二進位字串評估會產生與引數值長度相同的二進位字串。如果引數值的長度不相等,則會發生
ER_INVALID_BITWISE_OPERANDS_SIZE
錯誤。如果引數大小超過 511 位元組,則會發生ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
錯誤。數值評估會產生一個無符號 64 位元整數。
如果沒有符合的列,
BIT_OR()
會回傳一個中性值(所有位元都設為 0),其長度與引數值相同。NULL
值不會影響結果,除非所有值都是NULL
。在這種情況下,結果會是一個中性值,其長度與引數值相同。有關引數評估和結果類型的詳細資訊,請參閱第 14.12 節「位元函數與運算子」中的介紹性討論。
如果從 mysql 用戶端內呼叫
BIT_OR()
,則二進位字串結果會以十六進位表示法顯示,這取決於--binary-as-hex
的值。有關此選項的更多資訊,請參閱第 6.5.1 節「mysql — MySQL 命令列用戶端」。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。回傳
expr
中所有位元的位元XOR
運算結果。結果的類型取決於函數引數值是以二進位字串還是數字進行評估。
當引數值具有二進位字串類型,且引數不是十六進位文字、位元文字或
NULL
文字時,會進行二進位字串評估。否則會進行數值評估,並將引數值轉換為必要的無符號 64 位元整數。二進位字串評估會產生與引數值長度相同的二進位字串。如果引數值的長度不相等,則會發生
ER_INVALID_BITWISE_OPERANDS_SIZE
錯誤。如果引數大小超過 511 位元組,則會發生ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
錯誤。數值評估會產生一個無符號 64 位元整數。
如果沒有符合的列,
BIT_XOR()
會回傳一個中性值(所有位元都設為 0),其長度與引數值相同。NULL
值不會影響結果,除非所有值都是NULL
。在這種情況下,結果會是一個中性值,其長度與引數值相同。有關引數評估和結果類型的詳細資訊,請參閱第 14.12 節「位元函數與運算子」中的介紹性討論。
如果從 mysql 用戶端內呼叫
BIT_XOR()
,則二進位字串結果會以十六進位表示法顯示,這取決於--binary-as-hex
的值。有關此選項的更多資訊,請參閱第 6.5.1 節「mysql — MySQL 命令列用戶端」。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。回傳由
SELECT
陳述式擷取的列中,expr
的非NULL
值數量。結果為BIGINT
值。如果沒有符合的列,
COUNT()
會回傳0
。COUNT(NULL)
會回傳 0。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。mysql> SELECT student.student_name,COUNT(*) FROM student,course WHERE student.student_id=course.student_id GROUP BY student_name;
COUNT(*)
的不同之處在於它會回傳擷取的列數,無論這些列是否包含NULL
值。對於諸如
InnoDB
的交易儲存引擎而言,儲存精確的列數存在問題。可能會同時發生多個交易,每個交易都可能影響計數。InnoDB
不會保留資料表中的內部列數計數,因為並行交易可能同時 「看到」 不同數量的列。因此,SELECT COUNT(*)
陳述式僅計算目前交易可見的列。如果沒有額外的子句(例如
WHERE
或GROUP BY
),則針對InnoDB
資料表的SELECT COUNT(*) FROM
查詢效能會針對單執行緒工作負載進行最佳化。tbl_name
InnoDB
會處理SELECT COUNT(*)
陳述式,方法是遍歷最小的可用輔助索引,除非索引或最佳化工具提示指示最佳化工具使用不同的索引。如果不存在輔助索引,則InnoDB
會掃描叢集索引來處理SELECT COUNT(*)
陳述式。如果索引記錄並非完全位於緩衝池中,則處理
SELECT COUNT(*)
陳述式需要一些時間。若要加快計數,請建立一個計數器資料表,並讓您的應用程式根據它執行的插入和刪除來更新它。不過,在數千個並行交易同時啟動對同一個計數器資料表進行更新的情況下,此方法可能無法很好地擴展。如果近似的列數就足夠,請使用SHOW TABLE STATUS
。InnoDB
以相同方式處理SELECT COUNT(*)
和SELECT COUNT(1)
作業。效能上沒有差異。對於
MyISAM
資料表,如果SELECT
從一個資料表擷取、未擷取其他欄,且沒有WHERE
子句,則會對COUNT(*)
進行最佳化,使其快速回傳。例如mysql> SELECT COUNT(*) FROM student;
此最佳化僅適用於
MyISAM
資料表,因為此儲存引擎會儲存精確的列數,並且可以非常快速地存取。只有在將第一欄定義為NOT NULL
時,才會對COUNT(1)
進行相同的最佳化。COUNT(DISTINCT
expr
,[expr
...])回傳具有不同非
NULL
expr
值的列數。如果沒有符合的列,
COUNT(DISTINCT)
會回傳0
。mysql> SELECT COUNT(DISTINCT results) FROM student;
在 MySQL 中,您可以取得不包含
NULL
的不同運算式組合的數量,方法是給出運算式清單。在標準 SQL 中,您必須在COUNT(DISTINCT ...)
內連接所有運算式。此函數會回傳一個字串結果,其中包含來自群組的串連非
NULL
值。如果沒有非NULL
值,則會回傳NULL
。完整語法如下GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
mysql> SELECT student_name, GROUP_CONCAT(test_score) FROM student GROUP BY student_name;
或
mysql> SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;
在 MySQL 中,您可以取得運算式組合的串連值。若要消除重複值,請使用
DISTINCT
子句。若要對結果中的值進行排序,請使用ORDER BY
子句。若要以相反的順序排序,請將DESC
(遞減)關鍵字新增至您在ORDER BY
子句中排序的欄名稱。預設為遞增順序;可以使用ASC
關鍵字明確指定此順序。群組中值的預設分隔符號是逗號 (,
)。若要明確指定分隔符號,請使用SEPARATOR
,後接應該在群組值之間插入的字串文字值。若要完全消除分隔符號,請指定SEPARATOR ''
。結果會截斷為
group_concat_max_len
系統變數給定的最大長度,此變數的預設值為 1024。可以將此值設定得更高,儘管傳回值的有效最大長度會受到max_allowed_packet
的值所限制。在執行階段變更group_concat_max_len
的值的語法如下,其中val
是一個無符號整數SET [GLOBAL | SESSION] group_concat_max_len = val;
傳回值是一個非二進位或二進位字串,這取決於引數是非二進位字串還是二進位字串。結果類型為
TEXT
或BLOB
,除非group_concat_max_len
小於或等於 512,在這種情況下,結果類型為VARCHAR
或VARBINARY
。如果從 mysql 用戶端內呼叫
GROUP_CONCAT()
,則二進位字串結果會以十六進位表示法顯示,這取決於--binary-as-hex
的值。有關此選項的更多資訊,請參閱第 6.5.1 節「mysql — MySQL 命令列用戶端」。另請參閱
CONCAT()
和CONCAT_WS()
:第 14.8 節「字串函數與運算子」。JSON_ARRAYAGG(
col_or_expr
) [over_clause
]將結果集聚合為單一的
JSON
陣列,其元素由各列組成。此陣列中元素的順序未定義。此函數作用於欄位或評估為單一值的運算式。如果結果不包含任何列,或發生錯誤,則傳回NULL
。如果col_or_expr
為NULL
,則此函數會傳回 JSON[null]
元素的陣列。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。mysql> SELECT o_id, attribute, value FROM t3; +------+-----------+-------+ | o_id | attribute | value | +------+-----------+-------+ | 2 | color | red | | 2 | fabric | silk | | 3 | color | green | | 3 | shape | square| +------+-----------+-------+ 4 rows in set (0.00 sec) mysql> SELECT o_id, JSON_ARRAYAGG(attribute) AS attributes -> FROM t3 GROUP BY o_id; +------+---------------------+ | o_id | attributes | +------+---------------------+ | 2 | ["color", "fabric"] | | 3 | ["color", "shape"] | +------+---------------------+ 2 rows in set (0.00 sec)
JSON_OBJECTAGG(
key
,value
) [over_clause
]接受兩個欄位名稱或運算式作為引數,第一個作為鍵,第二個作為值,並傳回包含鍵值對的 JSON 物件。如果結果不包含任何列,或發生錯誤,則傳回
NULL
。如果任何鍵名稱為NULL
或引數數量不等於 2,則會發生錯誤。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。mysql> SELECT o_id, attribute, value FROM t3; +------+-----------+-------+ | o_id | attribute | value | +------+-----------+-------+ | 2 | color | red | | 2 | fabric | silk | | 3 | color | green | | 3 | shape | square| +------+-----------+-------+ 4 rows in set (0.00 sec) mysql> SELECT o_id, JSON_OBJECTAGG(attribute, value) -> FROM t3 GROUP BY o_id; +------+---------------------------------------+ | o_id | JSON_OBJECTAGG(attribute, value) | +------+---------------------------------------+ | 2 | {"color": "red", "fabric": "silk"} | | 3 | {"color": "green", "shape": "square"} | +------+---------------------------------------+ 2 rows in set (0.00 sec)
重複鍵處理。 當此函數的結果正規化時,具有重複鍵的值會被捨棄。為符合 MySQL
JSON
資料類型規範(不允許重複鍵),只會使用遇到的最後一個值作為傳回物件中該鍵的值(「最後一個重複鍵獲勝」)。這表示在SELECT
中使用此函數處理欄位時,結果會依賴傳回列的順序,而這順序是不保證的。當用作視窗函數時,如果框架內有重複的鍵,則結果中只會存在該鍵的最後一個值。如果
ORDER BY
規範保證這些值具有特定的順序,則框架中最後一列的鍵值是確定的。否則,鍵的結果值是不確定的。考慮以下情況
mysql> CREATE TABLE t(c VARCHAR(10), i INT); Query OK, 0 rows affected (0.33 sec) mysql> INSERT INTO t VALUES ('key', 3), ('key', 4), ('key', 5); Query OK, 3 rows affected (0.10 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT c, i FROM t; +------+------+ | c | i | +------+------+ | key | 3 | | key | 4 | | key | 5 | +------+------+ 3 rows in set (0.00 sec) mysql> SELECT JSON_OBJECTAGG(c, i) FROM t; +----------------------+ | JSON_OBJECTAGG(c, i) | +----------------------+ | {"key": 5} | +----------------------+ 1 row in set (0.00 sec) mysql> DELETE FROM t; Query OK, 3 rows affected (0.08 sec) mysql> INSERT INTO t VALUES ('key', 3), ('key', 5), ('key', 4); Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT c, i FROM t; +------+------+ | c | i | +------+------+ | key | 3 | | key | 5 | | key | 4 | +------+------+ 3 rows in set (0.00 sec) mysql> SELECT JSON_OBJECTAGG(c, i) FROM t; +----------------------+ | JSON_OBJECTAGG(c, i) | +----------------------+ | {"key": 4} | +----------------------+ 1 row in set (0.00 sec)
從最後一個查詢中選擇的鍵是不確定的。如果查詢未使用
GROUP BY
(通常會強制執行自己的排序,無論如何),並且您偏好特定的鍵排序,您可以透過包含帶有ORDER BY
規範的OVER
子句,以強制框架列採用特定順序,將JSON_OBJECTAGG()
作為視窗函數來調用。以下範例顯示在有和沒有ORDER BY
的情況下,針對幾個不同的框架規範會發生什麼。沒有
ORDER BY
時,框架為整個分割區mysql> SELECT JSON_OBJECTAGG(c, i) OVER () AS json_object FROM t; +-------------+ | json_object | +-------------+ | {"key": 4} | | {"key": 4} | | {"key": 4} | +-------------+
有
ORDER BY
時,框架為預設的RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
(依遞增和遞減順序)mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i) AS json_object FROM t; +-------------+ | json_object | +-------------+ | {"key": 3} | | {"key": 4} | | {"key": 5} | +-------------+ mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i DESC) AS json_object FROM t; +-------------+ | json_object | +-------------+ | {"key": 5} | | {"key": 4} | | {"key": 3} | +-------------+
有
ORDER BY
以及整個分割區的明確框架mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS json_object FROM t; +-------------+ | json_object | +-------------+ | {"key": 5} | | {"key": 5} | | {"key": 5} | +-------------+
若要傳回特定的鍵值(例如最小值或最大值),請在適當的查詢中包含
LIMIT
子句。例如mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i) AS json_object FROM t LIMIT 1; +-------------+ | json_object | +-------------+ | {"key": 3} | +-------------+ mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i DESC) AS json_object FROM t LIMIT 1; +-------------+ | json_object | +-------------+ | {"key": 5} | +-------------+
如需更多資訊和範例,請參閱 JSON 值的正規化、合併和自動包裝。
MAX([DISTINCT]
expr
) [over_clause
]傳回
expr
的最大值。MAX()
可以接受字串引數;在這種情況下,它會傳回最大字串值。請參閱章節 10.3.1,「MySQL 如何使用索引」。DISTINCT
關鍵字可以用來尋找expr
的相異值中的最大值,但這會產生與省略DISTINCT
相同的結果。如果沒有相符的列,或如果
expr
為NULL
,MAX()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」;它不能與DISTINCT
一起使用。mysql> SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;
對於
MAX()
,MySQL 目前會依據字串值而不是字串在集合中的相對位置來比較ENUM
和SET
欄位。這與ORDER BY
比較它們的方式不同。MIN([DISTINCT]
expr
) [over_clause
]傳回
expr
的最小值。MIN()
可以接受字串引數;在這種情況下,它會傳回最小字串值。請參閱章節 10.3.1,「MySQL 如何使用索引」。DISTINCT
關鍵字可以用來尋找expr
的相異值中的最小值,但這會產生與省略DISTINCT
相同的結果。如果沒有相符的列,或如果
expr
為NULL
,MIN()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」;它不能與DISTINCT
一起使用。mysql> SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;
對於
MIN()
,MySQL 目前會依據字串值而不是字串在集合中的相對位置來比較ENUM
和SET
欄位。這與ORDER BY
比較它們的方式不同。傳回
expr
的母體標準差。STD()
是標準 SQL 函數STDDEV_POP()
的同義詞,以 MySQL 擴充功能的形式提供。如果沒有相符的列,或如果
expr
為NULL
,STD()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。傳回
expr
的母體標準差。STDDEV()
是標準 SQL 函數STDDEV_POP()
的同義詞,為了與 Oracle 相容而提供。如果沒有相符的列,或如果
expr
為NULL
,STDDEV()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。STDDEV_POP(
expr
) [over_clause
]傳回
expr
的母體標準差(VAR_POP()
的平方根)。您也可以使用STD()
或STDDEV()
,它們是等效的,但不是標準 SQL。如果沒有相符的列,或如果
expr
為NULL
,STDDEV_POP()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。STDDEV_SAMP(
expr
) [over_clause
]傳回
expr
的樣本標準差(VAR_SAMP()
的平方根)。如果沒有相符的列,或如果
expr
為NULL
,STDDEV_SAMP()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。SUM([DISTINCT]
expr
) [over_clause
]傳回
expr
的總和。如果傳回的集合沒有任何列,SUM()
會傳回NULL
。DISTINCT
關鍵字可以用來只加總expr
的相異值。如果沒有相符的列,或如果
expr
為NULL
,SUM()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」;它不能與DISTINCT
一起使用。傳回
expr
的母體標準變異數。它將列視為整個母體,而不是樣本,因此它將列數作為分母。您也可以使用VARIANCE()
,它等效但不是標準 SQL。如果沒有相符的列,或如果
expr
為NULL
,VAR_POP()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。傳回
expr
的樣本變異數。也就是說,分母是列數減一。如果沒有相符的列,或如果
expr
為NULL
,VAR_SAMP()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。傳回
expr
的母體標準變異數。VARIANCE()
是標準 SQL 函數VAR_POP()
的同義詞,以 MySQL 擴充功能的形式提供。如果沒有相符的列,或如果
expr
為NULL
,VARIANCE()
會傳回NULL
。如果存在
over_clause
,此函數會作為視窗函數執行。over_clause
的說明請見 第 14.20.2 節「視窗函數的概念與語法」。