日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

窗口函數(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ù)

說明

function

該部分指定了窗口函數(shù)中支持的函數(shù),取值范圍如下:

  • 可以在窗口函數(shù)中結合OVER關鍵字使用如下聚合函數(shù):

    • SUM()

    • COUNT()

    • AVG()

    • MAX()

    • MIN()

  • 專用窗口函數(shù)如下:

    • ROW_NUMBER()

    • RANK()

    • DENSE_RANK()

    • PERCENT_RANK()

    • CUME_DIST()

    • FIRST_VALUE()

    • LAST_VALUE()

    • LAG()

    • LEAD()

    • NTH_VALUE()

說明
  • 當使用專用窗口函數(shù)RANK()DENSE_RANK()時,窗口函數(shù)中的order by部分不可省略。更多專用窗口函數(shù)的介紹,請參見Window Function Descriptions

  • 支持如下專用窗口函數(shù):

    • PERCENT_RANK()

    • CUME_DIST()

    • FIRST_VALUE()

    • LAST_VALUE()

    • LAG()

    • LEAD()

    • NTH_VALUE()

[partition by column_some1]

該部分指定了窗口函數(shù)的分區(qū)規(guī)范,用于將輸入行分散到不同的分區(qū)中,過程和GROUP BY子句的分散過程相似。

說明

partition by部分不支持引用復雜表達式,如您可以引用column_some1,但不可以引用column_some1 + 1

[order by column_some2]

該部分指定了窗口函數(shù)的排序規(guī)范,用于確定輸入數(shù)據(jù)行在窗口函數(shù)中執(zhí)行的順序。

說明

order by部分不支持引用復雜表達式,如您可以引用column_some2,但不可以引用column_some2 + 1

[RANGE|ROWS BETWEEN start AND end]

該部分指定了窗口函數(shù)的窗口區(qū)間,支持按照計算列值的范圍(即RANGE)或計算列的行數(shù)(即ROWS)等兩種模式來定義區(qū)間。

您可以使用BETWEEN start AND end指定邊界的可取值,其中:

  • start取值范圍如下:

    • CURRENT ROW:當前行

    • N PRECEDING:前N行

    • UNBOUNDED PRECEDING:直到第1行

  • end取值范圍如下:

    • CURRENT ROW:當前行

    • N FOLLOWING:后N行

    • UNBOUNDED FOLLOWING:直到最后1行

使用示例

假設已有如下原始數(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 |