MySQL 窗口函數深度解析:語法、應用場景與性能優化

一、窗口函數核心概念

??本質??:對一組與當前行相關聯的行執行計算,??不改變原表行數??
??與聚合函數的區別??:

SELECT department, AVG(salary)  -- 普通聚合:每個部門一行
FROM employees
GROUP BY department;SELECT name, salary, AVG(salary) OVER(PARTITION BY department)  -- 窗口函數:保留所有行
FROM employees;
二、窗口函數完整語法結構
函數名([參數]) OVER ([PARTITION BY 分組字段][ORDER BY 排序字段 [ASC|DESC]][frame_clause]
)
1. 核心子句詳解
  • ??PARTITION BY??:橫向切分窗口,類似?GROUP BY?但不聚合
  • ??ORDER BY??:定義窗口內排序,影響排名類函數和累計計算
  • ??frame_clause??:指定窗口范圍,語法:
  • ROWS | RANGE BETWEEN frame_start AND frame_end
    2. 窗口幀類型(frame_clause)
  • 類型示例說明
    默認幀RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW默認與排序字段相關
    物理行偏移ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING包含前2行到后1行
    邏輯值范圍RANGE BETWEEN INTERVAL 7 DAY PRECEDING AND CURRENT ROW時間范圍窗口
三、常用窗口函數分類
1. 排序函數
SELECT product_id,sales,ROW_NUMBER() OVER(ORDER BY sales DESC) AS rank1,  -- 唯一連續序號RANK() OVER(ORDER BY sales DESC) AS rank2,        -- 允許并列跳號DENSE_RANK() OVER(ORDER BY sales DESC) AS rank3   -- 允許并列不跳號
FROM sales_data;
2. 聚合窗口函數
SELECT date,revenue,SUM(revenue) OVER(ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS 3d_avg,AVG(revenue) OVER(PARTITION BY YEAR(date)) AS year_avg
FROM daily_sales;
3. 分布分析函數
SELECT student_id,score,PERCENT_RANK() OVER(ORDER BY score) AS percentile,  -- 相對百分比排名CUME_DIST() OVER(ORDER BY score) AS cumulative_dist -- 累計分布
FROM exam_results;
4. 偏移函數
SELECT date,temperature,LAG(temperature, 1) OVER(ORDER BY date) AS prev_day_temp,  -- 前一行LEAD(temperature, 1) OVER(ORDER BY date) AS next_day_temp, -- 后一行FIRST_VALUE(temperature) OVER(PARTITION BY WEEK(date)) AS week_first_temp
FROM weather;
四、典型應用場景
1. 動態分組TopN
-- 獲取每個部門薪資前三名
WITH ranked AS (SELECT name, department, salary,DENSE_RANK() OVER(PARTITION BY department ORDER BY salary DESC) AS rkFROM employees
)
SELECT * FROM ranked WHERE rk <= 3;
2. 累計計算
-- 計算累計銷售額與移動平均
SELECT order_date,daily_sales,SUM(daily_sales) OVER(ORDER BY order_date) AS cum_sum,AVG(daily_sales) OVER(ORDER BY order_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS 7d_ma
FROM orders;
3. 數據差異分析
-- 對比每月銷售額與上月差異
SELECT month,revenue,LAG(revenue, 1) OVER(ORDER BY month) AS prev_month,revenue - LAG(revenue, 1) OVER(ORDER BY month) AS mom_diff
FROM monthly_sales;
五、性能優化策略
1. 索引設計
-- 為窗口函數涉及的字段建立組合索引
ALTER TABLE sales ADD INDEX idx_dept_time (department, order_date);-- 執行計劃檢查
EXPLAIN 
SELECT product_id,SUM(quantity) OVER(PARTITION BY product_id ORDER BY sale_date)
FROM sales;
2. 分區剪枝優化
-- 結合WHERE條件減少處理分區
SELECT *
FROM (SELECT user_id,ROW_NUMBER() OVER(PARTITION BY city ORDER BY reg_date) AS rnFROM usersWHERE city IN ('北京','上海')  -- 提前過濾
) t
WHERE rn <= 100;
3. 避免重復計算
-- 使用WINDOW子句復用定義
SELECT AVG(sales) OVER w AS avg_sales,MAX(sales) OVER w AS max_sales
FROM sales_data
WINDOW w AS (PARTITION BY region ORDER BY month);
六、與臨時表結合的高級用法
1. 分階段計算
-- 第一階段:計算基礎窗口
CREATE TEMPORARY TABLE stage1 AS
SELECT user_id,SUM(amount) OVER(PARTITION BY user_id) AS total_amt
FROM transactions;-- 第二階段:二次聚合
SELECT AVG(total_amt) AS avg_amt_per_user
FROM stage1;
2. 遞歸窗口計算
-- 計算員工管理鏈層級
WITH RECURSIVE emp_tree AS (SELECT emp_id, manager_id, 1 AS level,CAST(emp_id AS CHAR(100)) AS pathFROM employeesWHERE manager_id IS NULLUNION ALLSELECT e.emp_id,e.manager_id,et.level + 1,CONCAT(et.path, '->', e.emp_id)FROM employees eJOIN emp_tree et ON e.manager_id = et.emp_id
)
SELECT emp_id,level,path,RANK() OVER(ORDER BY level) AS hierarchy_rank
FROM emp_tree;
七、常見錯誤排查
??錯誤現象????原因分析????解決方案??
結果排序不符合預期未正確使用ORDER BY明確指定排序字段和方向
窗口范圍計算錯誤ROWS與RANGE混淆使用確認需要物理行偏移還是邏輯值范圍
性能急劇下降未加分區條件導致全表掃描添加WHERE條件或分區過濾
出現重復排名使用了ROW_NUMBER而非RANK根據業務需求選擇正確的排名函數

八、版本特性差異
??MySQL版本????窗口函數支持??
5.x? 不支持
8.0.2+?? 基礎窗口函數
8.0.28+?? 新增NTH_VALUE()NTILE()等擴展函數

結語:最佳實踐原則
  1. ??明確窗口范圍??:始終指定ROWS/RANGE避免意外結果
  2. ??慎用無界窗口??:UNBOUNDED PRECEDING可能導致性能問題
  3. ??結合索引優化??:為PARTITION BYORDER BY字段建立索引
  4. ??分階段處理??:對復雜計算使用臨時表拆分步驟
  5. ??版本驗證??:生產環境確認MySQL版本支持情況
    -- 查看窗口函數執行計劃
    EXPLAIN FORMAT=JSON
    SELECT ... [包含窗口函數的查詢];-- 性能模式監控
    SELECT * FROM performance_schema.events_stages_history_long
    WHERE EVENT_NAME LIKE '%window%';

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82487.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新版Chrome瀏覽器加載eDrawings 3D Viewer控件網頁查看DWG、DXF

eDrawings是一款由達索系統&#xff08;DASSAULT SYSTMES&#xff09;開發的免費跨平臺CAD看圖工具&#xff0c;專注于3D模型和2D工程圖的查看、協作與共享。其核心功能包括多格式支持、動態模型展示、跨平臺適配及輕量化操作體驗&#xff0c;適用于工程設計、教育培訓等領域。…

阿姆斯特朗數

阿姆斯特朗數也就是俗稱的水仙花數&#xff0c;是指一個n位數&#xff0c;其各位數字的n次方之和等于該數本身。例如&#xff0c;153是一個水仙花數&#xff0c;因為153&#xff1d;13&#xff0b;53&#xff0b;33。請問100-10000所有水仙花數有哪些。 采用窮舉法對范圍之間的…

vmvare 虛擬機內存不足

centos 擴展物理卷df -hT / sudo du -hx --max-depth1 / | sort -rh | head -n 20 // 查看前20個的大文件 # 清理舊日志&#xff08;保留最近7天&#xff09; sudo find /var/log -type f -mtime 7 -delete sudo journalctl --vacuum-time7d # 清理yum緩存 sudo yum clean …

C++?繼承!!!

一、引言 代碼的復用對于代碼的質量以及程序員的代碼設計上都是非常重要的&#xff0c;C中的許多特性都體現了這一點&#xff0c;從函數復用、模板的引入到今天我們將一起學習的&#xff1a;繼承 二、什么是繼承&#xff1f; 1、繼承的概念 繼承(inheritance)機制是面向對象程…

Android設置界面層級為最上層實現

Android設置界面層級為最上層實現 文章目錄 Android設置界面層級為最上層實現一、前言二、Android設置界面層級為最上層實現1、主要代碼2、后遺癥 三、其他1、Android設置界面層級為最上層小結2、懸浮框的主要代碼懸浮框 注意事項&#xff08;1&#xff09;權限限制&#xff08…

Linux 了解篇

一、GNU 項目與 GPL 許可 &#xff08;一&#xff09;GNU 項目 GNU &#xff1a;GNU 是一個遞歸縮寫&#xff0c;代表 "GNUs Not Unix"。GNU 項目旨在開發一個完全自由的操作系統&#xff0c;該操作系統基于 Unix 的設計理念但不包含 Unix 的代碼。GNU 項目提供了大…

word 如何讓公式居中,公式編號右對齊

問題&#xff1a; 如何讓輸入的公式居中&#xff0c;公式編號右對齊&#xff1f; 解決方法&#xff1a; 方法一&#xff1a;使用制表符 1、輸入內容&#xff1a;先按一次“Tab”鍵&#xff08;制表符&#xff09;&#xff0c;然后鍵入公式&#xff0c;然后再按一次“Tab”鍵…

華為OD機試真題——最小循環子數組 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

OpenCv高階(十七)——dlib庫安裝、dlib人臉檢測

文章目錄 前言一、dlib庫簡介二、dlib庫安裝1、本地安裝&#xff08;離線&#xff09;2、線上安裝 三、dlib人臉檢測原理1、HOG 特征提取2、 SVM 分類器訓練3、 滑動窗口搜索4、非極大值抑制&#xff08;NMS&#xff09; 四、dlib人臉檢測代碼1、導入OpenCV計算機視覺庫和dlib機…

AD-PCB--AD20軟件安裝及中英文切換 DAY 2

1.軟件安裝 1.1 軟件包下載 給你一個捷徑&#xff1a; 1.2 安裝過程&#xff08;安裝過的人跳過就好&#xff0c;一般很多都支持懶人安裝&#xff09; 雙擊其中的exe文件 點擊下一步 選擇中文 接受用戶協議 下面這個彈窗有的沒有。 建議勾選導入導出 安裝目錄&#xff0c…

單向循環鏈表與雙向鏈表

單向循環鏈表的原理與應用 思考&#xff1a;對于單向鏈表而言&#xff0c;想要遍歷鏈表&#xff0c;則必須從鏈表的首結點開始進行遍歷&#xff0c;請問有沒有更簡單的方案實現鏈表中的數據的增刪改查&#xff1f; 回答&#xff1a;是有的&#xff0c;可以使用單向循環的鏈表進…

Windows鼠標掉幀測試與修復

前言 這兩天突然發現鼠標似乎有掉幀&#xff0c;但是掉的又不太明顯&#xff0c;用著感覺似乎快速移動的時候會有一瞬間卡一下&#xff0c;但是眼睛又看不清楚&#xff0c;不太確定是不是自己的心理作用&#xff0c;非常難受。 如何判斷鼠標是否掉幀 根據我的經驗&#xff0…

U 盤數據恢復全攻略

目錄 &#x1f4be; U盤數據誤刪怎么辦&#xff1f;兩款實用工具助你找回丟失文件&#xff01;1?? Recover My Files&#xff1a;數據恢復的得力助手&#x1f4cc; 主要特點&#x1f6e0; 使用步驟詳解1. 下載與安裝2. 啟動軟件并選擇恢復類型3. 選擇U盤所在分區4. 選擇文件恢…

HarmonyOS NEXT~鴻蒙系統運維:全面解析與最佳實踐

HarmonyOS NEXT&#xff5e;鴻蒙系統運維&#xff1a;全面解析與最佳實踐 摘要 本文深入探討鴻蒙(HarmonyOS)系統的運維管理&#xff0c;從架構特點到日常維護操作&#xff0c;全面分析這一全場景分布式操作系統的運維要點。文章將介紹鴻蒙系統特有的分布式能力運維管理、性能…

基于 STM32 的智慧農業溫室控制系統設計與實現

摘要 本文提出一種基于 STM32 微控制器的智慧農業溫室控制系統設計方案,通過集成多類型環境傳感器、執行機構及無線通信模塊,實現對溫室內溫濕度、光照、土壤濕度等參數的實時監測與自動調控。文中詳細闡述硬件選型、電路連接及軟件實現流程,并附關鍵代碼示例,為智慧農業領…

Appium+python自動化(五)- 模擬器

簡介 Appium是做安卓自動化的一個比較流行的工具&#xff0c;對于想要學習該工具但是又局限于沒 android 手機來說&#xff0c;可以通過安卓模擬器來解決該問題&#xff0c;下面就講解使用appium連接安卓模擬器的操作步驟。而是由于手機數據線問題&#xff0c;也只好先用模擬器…

汽車充電樁專用ASCP210系列電氣防火限流式保護器

1.概述汽車充電樁專用電氣防火限流式保護器 電氣防火限流式保護器可有效克服傳統斷路器、空氣開關和監控設備存在的短路電流大、切斷短路電流時間長、短路時產生的電弧火花大&#xff0c;以及使用壽命短等弊端&#xff0c;發生短路故障時&#xff0c;能以微秒級速度快速限制短…

Linux中磁盤分區與掛載

一、磁盤劃分 1.1 了解磁盤 硬盤的接口類型 接口類型發展方向應用場景IDESATA I/II/III個人PC機SCSISAS服務器上 磁盤命名規則 OSIDE(并口)SATA(串口)SCSIRHEL5/dev/hda/dev/sda/dev/sdaRHEL6/dev/sda/dev/sda/dev/sdaRHEL7/dev/sda/dev/sda/dev/sda 1.2 磁盤劃分 磁盤劃…

【數據分析】什么是特征蒸餾?

引言 —— “ 在數據洪流中提煉真金——解密特征蒸餾的藝術。” 在數據爆炸的時代&#xff0c;我們每天產生的信息量已遠超人類處理能力的極限。當企業擁有百萬維的用戶行為數據&#xff0c;醫療研究者面對TB級的基因測序記錄&#xff0c;工程師試圖從千萬張圖像中識別關鍵模式…

機器學習筆記【Week4】

一、 為什么要用神經網絡&#xff1f; 邏輯回歸只能處理線性可分問題。例如&#xff0c;經典的 XOR 異或問題無法用單層邏輯回歸準確分類。神經網絡通過多層結構和非線性激活函數&#xff0c;能學習復雜的決策邊界&#xff0c;解決非線性問題。 二、神經網絡的基本組成 神經網…