MySQL 中 ROW_NUMBER() 函數詳解

MySQL 中?ROW_NUMBER()?函數詳解

ROW_NUMBER()?是 SQL 窗口函數中的一種,用于為查詢結果集中的每一行分配一個??唯一的連續序號??。與?RANK()?和?DENSE_RANK()?不同,ROW_NUMBER()?不會處理重復值,即使排序字段值相同,也會嚴格按行順序遞增編號。

一、基礎語法
ROW_NUMBER() OVER ([PARTITION BY 分組字段]ORDER BY 排序字段 [ASC|DESC]
)
  • ??PARTITION BY??:按指定字段分組,每組內重新從1開始編號。
  • ??ORDER BY??:決定排序邏輯,影響行號的分配順序。

二、核心特點
??特性????說明??
唯一性每行序號嚴格遞增,不重復(即使排序字段值相同)
靈活性可結合分組(PARTITION BY)實現復雜場景
兼容性MySQL 8.0+ 原生支持,低版本需用變量模擬
性能影響未優化時可能導致全表掃描,需合理使用索引

三、典型應用場景
1. 數據分頁查詢
-- 查詢第3頁數據(每頁10條)
WITH paged_data AS (SELECT id, name, ROW_NUMBER() OVER (ORDER BY id) AS row_numFROM users
)
SELECT * 
FROM paged_data 
WHERE row_num BETWEEN 21 AND 30;
2. 刪除重復數據
-- 保留最新記錄(假設 create_time 為時間戳)
DELETE FROM orders
WHERE (id, product_id) IN (SELECT id, product_id FROM (SELECT id, product_id,ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY create_time DESC) AS rnFROM orders) t WHERE rn > 1  -- 刪除重復項,保留最新一條
);
3. 分組取Top N記錄
-- 獲取每個部門薪資前3名
SELECT *
FROM (SELECT name, department, salary,ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rankFROM employees
) ranked
WHERE dept_rank <= 3;
4. 生成唯一流水號
-- 按日期生成訂單流水號(格式:YYYYMMDD-0001)
SELECT order_id,CONCAT(DATE_FORMAT(create_time, '%Y%m%d'), '-', LPAD(ROW_NUMBER() OVER (PARTITION BY DATE(create_time) ORDER BY create_time), 4, '0')) AS serial_num
FROM orders;

四、與其他排序函數對比
函數重復值處理示例結果(排序字段值相同)
ROW_NUMBER()強制分配不同序號1, 2, 3, 4
RANK()相同值共享排名,后續跳過序號1, 1, 3, 4
DENSE_RANK()相同值共享排名,后續連續遞增1, 1, 2, 3
-- 對比三種函數
SELECT score,ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num,RANK() OVER (ORDER BY score DESC) AS rank,DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM exam_scores;

五、性能優化技巧
1. 索引設計
  • 為?PARTITION BY?和?ORDER BY?涉及的字段創建聯合索引:
     
    CREATE INDEX idx_dept_salary ON employees(department, salary DESC);

2. 減少計算范圍
 
-- 僅處理2023年數據
SELECT *
FROM (SELECT order_id, amount,ROW_NUMBER() OVER (ORDER BY amount DESC) AS rnFROM ordersWHERE YEAR(order_date) = 2023  -- 先過濾再排序
) t
WHERE rn <= 100;
3. 避免嵌套查詢
-- 優化前(性能差)
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (...) AS rnFROM large_table
) t WHERE rn <= 100;-- 優化后(直接使用LIMIT,若邏輯允許)
SELECT *, ROW_NUMBER() OVER (...) AS rn
FROM large_table
ORDER BY ...
LIMIT 100;

六、MySQL低版本兼容方案(5.7及以下)
使用會話變量模擬?ROW_NUMBER()
 
-- 按部門分組排序
SELECT department, name, salary,@row_num := IF(@current_dept = department, @row_num + 1, 1) AS row_num,@current_dept := department AS dummy
FROM employees
ORDER BY department, salary DESC;

七、常見錯誤與排查
1. 錯誤:序號不符合預期
  • ??原因??:未正確指定?ORDER BY?或?PARTITION BY
  • ??解決??:檢查排序字段是否明確,分組條件是否合理
2. 錯誤:性能低下
  • ??原因??:未使用索引導致全表掃描
  • ??解決??:使用?EXPLAIN?分析執行計劃,添加必要索引
3. 錯誤:結果集為空
  • ??原因??:外層查詢條件與子查詢中的?WHERE?沖突
  • ??解決??:驗證過濾條件邏輯

八、最佳實踐
  1. ??明確排序規則??:始終顯式指定?ORDER BY?的排序方向(ASC/DESC)
  2. ??慎用全局排序??:避免無?PARTITION BY?的大數據集操作
  3. ??監控內存使用??:窗口函數可能消耗大量臨時內存
  4. ??版本驗證??:生產環境確認 MySQL 版本 >= 8.0
  5. ??結合 CTE 使用??:提高復雜查詢的可讀性
    WITH ranked_products AS (SELECT product_id,ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) AS rnFROM products
    )
    SELECT * FROM ranked_products WHERE rn = 1;


??總結??:ROW_NUMBER()?是處理行級序號分配的利器,特別適合需要精確控制行順序的場景。合理使用可顯著簡化分頁、去重、Top N查詢等操作,但需注意其對性能的影響,尤其在處理海量數據時需結合索引優化。

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

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

相關文章

Leetcode百題斬-二叉樹

二叉樹作為經典面試系列&#xff0c;那么當然要來看看。總計14道題&#xff0c;包含大量的簡單題&#xff0c;說明這確實是個比較基礎的專題。快速過快速過。 先構造一個二叉樹數據結構。 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode…

Asp.Net Core 如何配置在Swagger中帶JWT報文頭

文章目錄 前言一、配置方法二、使用1、運行應用程序并導航到 /swagger2、點擊右上角的 Authorize 按鈕。3、輸入 JWT 令牌&#xff0c;格式為 Bearer your_jwt_token。4、后續請求將自動攜帶 Authorization 頭。 三、注意事項總結 前言 配置Swagger支持JWT 一、配置方法 在 …

MySQL 定時邏輯備份

文章目錄 配置密碼編寫備份腳本配置權限定時任務配置檢查效果如果不想保留明文密碼手工配置備份密碼修改備份命令 配置密碼 cat >> /root/.my.cnf <<"EOF" [client] userroot passwordYourPassword EOF編寫備份腳本 cat > /usr/local/bin/mysql_dum…

在qt中使用c++實現與Twincat3 PLC變量通信

這是一個只針對新手的教程&#xff0c;下載安裝就不說了&#xff0c;我下的是TC31-Full-Setup.3.1.4024.66.exe是這個版本&#xff0c;其他版本應該問題不大。 先創建一個項目 選中SYSTEM&#xff0c;在右側點擊Choose Target&#xff08;接下來界面跟我不一樣沒關系&#xf…

云原生微服務devops項目管理英文表述詳解

文章目錄 1.云原生CNCF trail map云原生技術棧路線圖 2. 微服務單體應用與微服務應用架構區別GraphQLKey differences: GraphQL and REST 3.容器化&編排dockerKubernetesContainers and ContainerizationContainer Basics 4. DevOps & CI/CDTerms and Definitions 5.Ag…

pyside 使用pyinstaller導出exe(含ui文件)

第一步&#xff1a;首先確保安裝好pyinstall&#xff0c;終端運行 pyinstaller -w main.py 生成兩個文件夾 打開exe文件報錯&#xff0c;問題是ui文件找不到 第二步&#xff1a;將ui文件復制到exe所在文件夾&#xff0c;打開成功 ![在這里插入圖片描述](https://i-blog.csdni…

kerberos在無痕瀏覽器 獲取用戶信息失敗 如何判斷是否無痕瀏覽器

kerberos在無痕瀏覽器 獲取用戶信息失敗 如何判斷是否無痕瀏覽器 js 代碼 其他地方用直接導入js getCurrentUserId 這是自己后端獲取 域賬號地址 我是成功返回200 //true普通瀏覽器 fasle 無痕瀏覽器 export const checkBrowserMode async () > {try {const response a…

HTML 計算網頁的PPI

HTML 計算網頁的PPI vscode上安裝live server插件&#xff0c;可以實時看網頁預覽 有個疑問&#xff1a; 鴻蒙density是按照類別寫死的嗎&#xff0c;手機520dpi 折疊屏426dpi 平板360dpi <html lang"en" data - overlayscrollbars - initialize><header&…

華為OD機試真題——Boss的收入(分銷網絡提成計算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

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

<el-date-picker>組件傳參時,選中時間和傳參偏差8小時

遇到一個bug&#xff0c;不仔細看&#xff0c;都不一定能發現&#xff0c;bug描述&#xff1a;我們有一個搜索框&#xff0c;里面有一個時間選擇器&#xff0c;當我使用<el-date-picker>時&#xff0c;我發現當我選擇時分秒之后&#xff0c;顯示都正常&#xff0c;但是當…

uni-app開發特殊社交APP

uni-app開發特殊社交APP 目錄 1.展示APP功能 2.展示項目結構 3.關于我的GitHub 引言 博主最近自己在GitHub上面上傳了一個關于社交軟件的項目&#xff08;該項目早已開發完畢&#xff09;, 這個社交軟件比較特殊, 被稱之為blind-date&#xff0c; blind-date 是基于 uni-…

深入研究Azure 容器網絡接口 (CNI) overlay

啟用cni overlay 在通過portal創建aks的時候,在networking配置上,選中下面的選項即可啟用。 通過CLI創建AKS 要創建具有 CNI 覆蓋網絡的 AKS 群集,需要在創建群集時指定 --network-plugin azure 和 --network-plugin-mode 覆蓋選項。 還需要指定 --pod-cidr 選項來定義群…

Docker 部署項目

使用 Docker 部署項目是一個很好的選擇&#xff0c;可以避免服務器環境不兼容的問題&#xff0c;并且能夠實現一致性和可移植性。我會給你一個詳細的步驟&#xff0c;幫你從零開始理解 Docker&#xff0c;最終在服務器上部署 Roop 項目。 1. 安裝 Docker 首先&#xff0c;你需…

excel表格記賬 : 操作單元格進行加減乘除 | Excel中Evaluate函數

文章目錄 引用I 基礎求和∑II Excel中Evaluate函數基于字符串表達式進行計算用法案例 :基于Evaluate實現匯率計算利潤知識擴展在單元格內的換行選擇整列單元格引用 需求: 基于匯率計算利潤,調整金額以及進匯率和出匯率自動算出利潤,已經統計總利潤。 基于Evaluate實現匯率計…

vue+ts+TinyEditor 是基于 Quill 2.0 開發的富文本編輯器,提供豐富的擴展功能,適用于現代 Web 開發的完整安裝使用教程

簡介 TinyEditor 是基于 Quill 2.0 開發的富文本編輯器&#xff0c;提供豐富的擴展功能&#xff0c;適用于現代 Web 開發。具備模塊化設計、輕量級架構和高度可定制化特性&#xff0c;支持多種插件擴展&#xff0c;滿足不同場景需求。 核心特性 基于 Quill 2.0 的現代化架構模…

matlab實現激光腔長計算滿足熱透鏡效應

激光腔長計算與熱透鏡效應補償 在全固態激光器中&#xff0c;熱透鏡效應是一個重要的問題&#xff0c;因為它會影響激光的光束質量和輸出功率。以下是如何計算激光腔長并考慮熱透鏡效應的方法&#xff0c;以及一些補償技術。 1. 激光腔長計算 激光腔長的計算需要考慮激光晶體…

Science Robotics 具身智能驅動的空中物理交互新范式:結合形態和傳感,與非結構化環境進行穩健交互

隨著科技的飛速發展&#xff0c;無人機技術已從單純的遠程感知擴展到與環境的物理交互領域&#xff0c;為可持續發展目標的實現提供了新的可能性。傳統的空中物理交互方法依賴于復雜的控制策略和精確的環境建模&#xff0c;盡管能夠實現高精度操作&#xff0c;但其在非結構化自…

圖神經網絡在信息檢索重排序中的應用:原理、架構與Python代碼解析

現代信息檢索系統和搜索引擎普遍采用兩階段檢索架構&#xff0c;在人工智能應用中也被稱為檢索增強生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;。在初始檢索階段&#xff0c;系統采用高效的檢索方法&#xff0c;包括詞匯檢索算法&#xff08;如BM25&…

List 源碼翻譯

List 源碼翻譯-jdk1.8 翻譯來自 AI 大模型。 全部源碼翻譯下載 /** 版權所有 (c) 1997, 2014, Oracle 和/或其附屬公司。保留所有權利。* ORACLE 專有/機密。使用受許可條款約束。*********************/package java.util;import java.util.function.UnaryOperator;/*** 有序…