最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL8.0版本如何正確的使用窗口函數詳解

 更新時間:2024年11月07日 08:10:14   作者:一葉飛舟  
MySQL?8.0引入的窗口函數,增強了數據分析能力,窗口函數允許對數據集(窗口)進行操作,與GROUPBY類似,但每個查詢行生成獨立結果,包括聚合函數如SUM、AVG,專用窗口函數如ROW_NUMBER等,窗口函數應用于數據分組、排序、排名,并支持復雜分析場景,需要的朋友可以參考下

前言

MySQL數據庫從8.0開始支持窗口函數了,它是一種強大的數據分析工具,旨在幫助你快速獲得場景數據。在正式介紹這類函數前,博主還是解釋一下為什么這么稱呼這類函數為“窗口”函數。窗口——一個數據記錄的集合,也就是你的數據操作范圍只限于這個數據集,再無其他。它與group by類似, 但是最大的區(qū)別是窗口函數會為每個查詢行生成一個結果(add column)。

恭喜你,有這個認知后,博主可以正式介紹它了,請緊隨博主,以防迷路。

窗口函數必學必會

既然窗口函數是服務于數據分析的,那么先來看看它長什么樣,有句話說得好:“沒吃過豬肉,還沒見過豬跑么”。當我們Get一個新知時,也要懷著同樣的預期和先行一步的姿態(tài)去對待它。那咱們先看看它的語法結構吧。

1. 基本語法

1.1 匿名窗口

SELECT 
	<窗口函數名> over (partition by <分組列名> order by <排序列名>)
FROM `你的表名` 

1.2 顯式窗口

SELECT 
	<窗口函數名> OVER win
FROM `你的表名` 
WINDOW win AS (partition by <分組列名> order by <排序列名>)

其中,窗口函數名必須指定,partition by(可選),order by(可選)。

2. 包括哪些

窗口函數主要包含兩大類:常見的聚合函數(count、sum、avg等)和專用的窗口函數(比如排序等)。

2.1 聚合函數

大多數的聚合函數皆可用作窗口函數,通常與GROUP BY子句使用,將統(tǒng)計值分組到子集中。

聚合函數用途說明
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子句的SQL中使用聚合函數,則相當于對所有行進行分組。對于數值參數,方差和標準偏差函數返回一個DOUBLE值。SUM()和AVG()函數如果為精確值參數(整數或DECIMAL)返回DECIMAL值,如果為近似值參數(FLOAT或DOUBLE)返回DOUBLE值。

如使一個聚合函數轉換為一個窗口函數執(zhí)行,需按如下格式執(zhí)行(over子句):

# 添加over子句
SUM([DISTINCT] expr) [over_clause]

示例1-普通聚合:這是一個普通聚合函數寫法(來自官網):

SELECT 
     country, 
     SUM(profit) AS country_profit
FROM sales
GROUP BY country
ORDER BY country;

示例2-窗口函數:這是一個轉為窗口函數寫法(來自官網):

SELECT
     year, country, product, profit,
     SUM(profit) OVER() AS total_profit,
     SUM(profit) OVER(PARTITION BY country) AS country_profit
FROM sales
ORDER BY country, year, product, profit;

是不是很簡單?

2.2 專用窗口函數

我們已知窗口函數是對一個記錄集執(zhí)行類似聚合的操作。然而,雖然聚合操作將查詢行分組為單個結果行,但窗口函數會為每個查詢行生成一個結果。

窗口函數用途說明
ROW_NUMBER()為結果集中的每行記錄分配唯一的連續(xù)整數序號
RANK()為結果集中的每行記錄分配一個排名
DENSE_RANK()為結果集中的每行分配一個排名,但不會跳過相同的排名
PERCENT_RANK()用于計算某行在結果集中的相對排名比,其值介于0-1間,表示相對位置
CUME_DIST()用于計算某行在結果集中的累積分布值,其值介于0-1間,表示累計分布比例
LAG(expr,n)返回當前行的前 n 行的expr值
LEAD(expr,n)返回當前行的后 n 行的expr的值
FIRST_VALUE(expr)返回第一個expr的值
LAST_VALUE(expr)返回最后一個expr的值
NTILE()返回當前行在其分區(qū)內的桶數
NTH_VALUE()返回窗口內第N行的參數值

over_clause表示over子句。

某些窗口函數允許使用null_treation子句,該子句指定在計算結果時如何處理null值,本選項款為可選。它是SQL標準的一部分,但MySQL實現只允許RESPECT NULL(這也是默認值)。這意味著在計算結果時會考慮NULL值。

博主這里提供5個示例(來自官網)。請注意SQL中的OVER子句。

示例1:

SELECT
     val,
     ROW_NUMBER()   OVER w AS 'row_number',
     CUME_DIST()    OVER w AS 'cume_dist',
     PERCENT_RANK() OVER w AS 'percent_rank'
FROM numbers
WINDOW w AS (ORDER BY val);

示例2:

 SELECT
      time, subject, val,
      FIRST_VALUE(val)  OVER w AS 'first',
      LAST_VALUE(val)   OVER w AS 'last',
      NTH_VALUE(val, 2) OVER w AS 'second',
      NTH_VALUE(val, 4) OVER w AS 'fourth'
FROM observations
WINDOW w AS (PARTITION BY subject ORDER BY time ROWS UNBOUNDED PRECEDING);

示例3:

SELECT
    t, val,
    LAG(val)        OVER w AS 'lag',
    LEAD(val)       OVER w AS 'lead',
    val - LAG(val)  OVER w AS 'lag diff',
    val - LEAD(val) OVER w AS 'lead diff'
FROM series
WINDOW w AS (ORDER BY t);

示例4:

SELECT
     val,
     ROW_NUMBER() OVER w AS 'row_number',
     NTILE(2)     OVER w AS 'ntile2',
     NTILE(4)     OVER w AS 'ntile4'
FROM numbers
WINDOW w AS (ORDER BY val);

示例5:

SELECT
     val,
     ROW_NUMBER() OVER w AS 'row_number',
     RANK()       OVER w AS 'rank',
     DENSE_RANK() OVER w AS 'dense_rank'
FROM numbers
WINDOW w AS (ORDER BY val);

結語

窗口函數的主要作用是對查詢結果集中的行進行分組、排序,并在每個分組內進行聚合、排名、計算等操作,但不會改變原始查詢結果的行數或順序。‌ 窗口函數主要用于數據分析場景,其最大的特點是輸入值是從SELECT語句結果集中的一行或多行的“窗口”中獲取的‌。窗口函數的具體應用場景包括:

  • 分組排序‌:可以對數據進行分組排序,求和、求平均值、計數等‌;
  • 排名計算‌:計算分組內的排名或累積求和等‌;
  • 數據分析‌:提供強大的數據分析支持,如計算同比/環(huán)比增長率等‌;

到此這篇關于MySQL8.0版本如何正確的使用窗口函數的文章就介紹到這了,更多相關MySQL8.0正確使用窗口函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL在哪些情況下不使用索引的示例

    MySQL在哪些情況下不使用索引的示例

    盡管索引可以顯著提高數據庫的查詢性能,但在某些情況下,MySQL可能不會使用索引,本文就來介紹一下MySQL在哪些情況下不使用索引,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • mysql limit 分頁的用法及注意要點

    mysql limit 分頁的用法及注意要點

    limit在mysql語句中使用的頻率非常高,一般分頁查詢都會使用到limit語句,本文章向碼農們介紹mysql limit 分頁的用法與注意事項,需要的朋友可以參考下
    2016-12-12
  • MySQL備份原理詳解

    MySQL備份原理詳解

    備份是數據安全的最后一道防線,對于任何數據丟失的場景,備份雖然不一定能恢復百分之百的數據(取決于備份周期),但至少能將損失降到最低
    2016-05-05
  • MySQL數據庫case?when?then?end的詳細使用方法

    MySQL數據庫case?when?then?end的詳細使用方法

    在SQL語法中我們首先使用CASE關鍵字開頭,然后根據不同的條件使用WHEN關鍵字,并在每個條件后面指定結果,這篇文章主要給大家介紹了關于MySQL數據庫case?when?then?end的詳細使用方法,需要的朋友可以參考下
    2023-12-12
  • MySQL死鎖類deadlock問題排查

    MySQL死鎖類deadlock問題排查

    本文主要介紹了MySQL死鎖類deadlock問題排查,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • 詳解MySQL InnoDB的索引擴展

    詳解MySQL InnoDB的索引擴展

    這篇文章主要介紹了MySQL InnoDB的索引擴展的相關資料,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下
    2020-08-08
  • MySQL讀取Binlog日志常見的3種錯誤

    MySQL讀取Binlog日志常見的3種錯誤

    這篇文章主要介紹了MySQL讀取Binlog日志常見的3種錯誤,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • mysql鎖表確認及解除鎖表的實現示例

    mysql鎖表確認及解除鎖表的實現示例

    使用MySQL數據庫時,我們可能會遇到數據庫表被鎖定的情況,本文主要介紹了mysql鎖表確認及解除鎖表的實現示例, 具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Mysql計算字段長度函數之CHAR_LENGTH函數

    Mysql計算字段長度函數之CHAR_LENGTH函數

    mysql中計算字符串長度有兩個函數分別為char_length和length,char_length函數可以計算unicode字符,下面這篇文章主要給大家介紹了關于Mysql計算字段長度函數之CHAR_LENGTH函數的相關資料,需要的朋友可以參考下
    2023-05-05
  • springboot啟動404問題以及解決方案

    springboot啟動404問題以及解決方案

    這篇文章主要介紹了springboot啟動404問題以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

繁昌县| 黎平县| 南部县| 莱芜市| 无棣县| 台安县| 沧源| 卫辉市| 天气| 辉南县| 丹江口市| 三河市| 双流县| 云林县| 新乐市| 商洛市| 长治县| 高唐县| 荔浦县| 会理县| 衢州市| 嵊州市| 万年县| 长春市| 罗平县| 贵州省| 吉首市| 甘孜| 正安县| 泰顺县| 南川市| 嘉善县| 大邑县| 鄂州市| 桦甸市| 无为县| 余庆县| 江北区| 金坛市| 遵化市| 河西区|