窗口函數(shù)
傳統(tǒng)的Group By函數(shù)會按照分組后的查詢結果進行聚合計算,且每個分組只輸出一條數(shù)據(jù)。但與傳統(tǒng)的Group By函數(shù)不同,窗口函數(shù)(也稱OLAP函數(shù))可以為每個分組返回多個值,且不會影響記錄的數(shù)量。本文介紹如何使用窗口函數(shù)。
使用限制
窗口函數(shù)僅支持在MySQL 8.0以上版本中使用。
窗口函數(shù)僅支持用于SELECT語句中。
窗口函數(shù)禁止與單獨的聚合函數(shù)混合使用。
例如,在如下語句中,SUM為聚合函數(shù),且未與OVER關鍵字組合,因此您無法使用如下語句進行查詢:
SELECT SUM(NAME),COUNT() OVER(...) FROM SOME_TABLE
若需實現(xiàn)如上查詢,您可以使用如下語句代替:
SELECT SUM(NAME),WIN1 FROM (SELECT NAME,COUNT() OVER(...) AS WIN1 FROM SOME_TABLE) alias
語法
function OVER ([[partition by column_some1] [order by column_some2] [RANGE|ROWS BETWEEN start AND end]])
參數(shù) | 說明 |
| 該部分指定了窗口函數(shù)中支持的函數(shù),取值范圍如下:
說明
|
| 該部分指定了窗口函數(shù)的分區(qū)規(guī)范,用于將輸入行分散到不同的分區(qū)中,過程和GROUP BY子句的分散過程相似。 說明
|
| 該部分指定了窗口函數(shù)的排序規(guī)范,用于確定輸入數(shù)據(jù)行在窗口函數(shù)中執(zhí)行的順序。 說明
|
| 該部分指定了窗口函數(shù)的窗口區(qū)間,支持按照計算列值的范圍(即RANGE)或計算列的行數(shù)(即ROWS)等兩種模式來定義區(qū)間。 您可以使用
|
使用示例
假設已有如下原始數(shù)據(jù):
| year | country | product | profit |
|------|---------|------------|--------|
| 2001 | Finland | Phone | 10 |
| 2000 | Finland | Computer | 1500 |
| 2001 | USA | Calculator | 50 |
| 2001 | USA | Computer | 1500 |
| 2000 | Singapore | Calculator | 75 |
| 2000 | Singapore | Calculator | 75 |
| 2001 | Singapore | Calculator | 79 |
您可以使用如下聚合函數(shù)來統(tǒng)計每個國家的總利潤:
select country, sum(profit) over (partition by country) sum_profit from test_window;
返回結果如下:
| country | sum_profit | |---------|------------| | Singapore | 229 | | Singapore | 229 | | Singapore | 229 | | USA | 1550 | | USA | 1550 | | Finland | 1510 | | Finland | 1510 |
您可以使用如下專用窗口函數(shù)將數(shù)據(jù)按照國家分組,并將國家內(nèi)的產(chǎn)品按利潤由小到大排名:
select year, country, product, profit, rank() over (partition by country order by profit) as rank from test_window;
返回結果如下:
| year | country | product | profit | rank | |------|---------|------------|--------|------| | 2001 | Finland | Phone | 10 | 1 | | 2000 | Finland | Computer | 1500 | 2 | | 2001 | USA | Calculator | 50 | 1 | | 2001 | USA | Computer | 1500 | 2 | | 2000 | Singapore | Calculator | 75 | 1 | | 2000 | Singapore | Calculator | 75 | 1 | | 2001 | Singapore | Calculator | 79 | 3 |
您可以使用如下帶有ROWS命令的語句,查詢根據(jù)當前窗口的每行數(shù)據(jù)計算利潤部分的總和:
select year, country, profit, sum(profit) over (partition by country order by 'year' ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW) as sum_win from test_window;
返回結果如下:
+------+---------+--------+-------------+ | year | country | profit | sum_win | +------+---------+--------+-------------+ | 2001 | USA | 50 | 50 | | 2001 | USA | 1500 | 1550 | | 2000 | Singapore | 75 | 75 | | 2000 | Singapore | 75 | 150 | | 2001 | Singapore | 79 | 229 | | 2000 | Finland | 1500 | 1500 | | 2001 | Finland | 10 | 1510 |