当前位置: 首页 > article >正文

别再傻傻分不清了!用MySQL 8.0实战演示row_number、rank、dense_rank到底怎么选

MySQL 8.0排名函数实战指南row_number、rank、dense_rank的智能选择每次面对需要排名的SQL查询时你是否也在纠结该用哪个窗口函数row_number、rank还是dense_rank这三个看似相似的函数在实际业务场景中却有着截然不同的表现。让我们通过一个电商平台的真实案例彻底搞懂它们之间的区别和适用场景。1. 电商排名场景搭建与基础概念假设我们正在为某电商平台开发用户积分排行榜功能数据表结构如下CREATE TABLE user_points ( user_id INT PRIMARY KEY, username VARCHAR(50) NOT NULL, points INT NOT NULL, registration_date DATE ); -- 插入测试数据 INSERT INTO user_points VALUES (101, 数码达人, 8500, 2023-01-15), (102, 时尚买手, 9200, 2023-02-20), (103, 家居专家, 9200, 2023-03-10), (104, 美妆教主, 7800, 2023-01-05), (105, 美食家, 9200, 2023-04-01), (106, 旅行家, 8100, 2023-02-28), (107, 图书爱好者, 7600, 2023-03-15), (108, 运动健将, 8900, 2023-01-20);1.1 窗口函数基础语法所有三个排名函数都遵循相同的语法模式函数名() OVER ( [PARTITION BY 分组字段] ORDER BY 排序字段 [ASC|DESC] )PARTITION BY可选用于先分组再组内排序ORDER BY必需指定排序依据的字段和方向提示在MySQL 8.0中窗口函数性能已大幅优化但大数据量时仍需注意合理使用索引。2. 三大排名函数深度对比2.1 row_number严格的顺序编号row_number()为每一行分配唯一的连续序号即使排序值相同SELECT user_id, username, points, ROW_NUMBER() OVER (ORDER BY points DESC) AS rank FROM user_points;执行结果user_idusernamepointsrank102时尚买手92001103家居专家92002105美食家92003108运动健将89004101数码达人85005106旅行家81006104美妆教主78007107图书爱好者76008核心特点绝对唯一的连续编号相同points值的用户获得不同rank值适合需要严格区分名次的场景2.2 rank允许并列的真实排名rank()函数会在值相同时给相同排名但会保留排名间的空隙SELECT user_id, username, points, RANK() OVER (ORDER BY points DESC) AS rank FROM user_points;执行结果user_idusernamepointsrank102时尚买手92001103家居专家92001105美食家92001108运动健将89004101数码达人85005106旅行家81006104美妆教主78007107图书爱好者76008关键区别三个9200分的用户并列第1名下一个用户直接跳到第4名跳过了2、3符合传统体育比赛的排名方式2.3 dense_rank紧凑的连续排名dense_rank()与rank()类似允许并列但排名数字是连续的SELECT user_id, username, points, DENSE_RANK() OVER (ORDER BY points DESC) AS rank FROM user_points;执行结果user_idusernamepointsrank102时尚买手92001103家居专家92001105美食家92001108运动健将89002101数码达人85003106旅行家81004104美妆教主78005107图书爱好者76006显著特征并列第一后下一个是第二而非第四排名数字连续无间隔总排名数量最少3. 业务场景选择指南3.1 何时选择row_number适用场景需要绝对唯一的标识符如分页查询生成连续的行号如导出报表不允许并列的严格排名如某些竞赛规则电商案例-- 为每个用户生成唯一的会员编号基于注册时间 SELECT user_id, username, ROW_NUMBER() OVER (ORDER BY registration_date) AS member_number FROM user_points;3.2 何时选择rank适用场景体育比赛排名允许并列且保留名次间隔需要显示实际排名位置的场景当业务逻辑要求反映真实排名时电商案例-- 显示用户的实际排名考虑并列情况 SELECT username, points, RANK() OVER (ORDER BY points DESC) AS global_rank FROM user_points WHERE RANK() OVER (ORDER BY points DESC) 10; -- 获取前10名注意直接在WHERE中使用窗口函数会报错需要使用子查询或CTE。3.3 何时选择dense_rank适用场景需要紧凑连续的排名数字奖品分配按排名层级而非绝对位置当排名间隔可能引起误解时电商案例-- 按排名层级发放不同级别的优惠券 SELECT username, points, DENSE_RANK() OVER (ORDER BY points DESC) AS tier FROM user_points WHERE DENSE_RANK() OVER (ORDER BY points DESC) 3; -- 获取前三档用户4. 高级应用与性能优化4.1 分组排名实战窗口函数的真正威力在于分组排名-- 按注册月份分组后的积分排名 SELECT user_id, username, points, DATE_FORMAT(registration_date, %Y-%m) AS reg_month, ROW_NUMBER() OVER (PARTITION BY DATE_FORMAT(registration_date, %Y-%m) ORDER BY points DESC) AS month_rank FROM user_points;4.2 多维度排序技巧当主要排序字段相同时可以添加次要排序条件-- 积分相同则按注册时间排序 SELECT user_id, username, points, registration_date, RANK() OVER (ORDER BY points DESC, registration_date) AS rank FROM user_points;4.3 性能优化建议索引策略为PARTITION BY和ORDER BY涉及的字段创建复合索引示例CREATE INDEX idx_points_reg ON user_points(points DESC, registration_date)减少计算量-- 先过滤再排名提高性能 WITH filtered_users AS ( SELECT * FROM user_points WHERE points 8000 ) SELECT user_id, username, points, RANK() OVER (ORDER BY points DESC) AS rank FROM filtered_users;避免重复计算-- 使用CTE避免多次计算相同窗口 WITH ranked_users AS ( SELECT user_id, username, points, RANK() OVER (ORDER BY points DESC) AS rank, DENSE_RANK() OVER (ORDER BY points DESC) AS dense_rank FROM user_points ) SELECT * FROM ranked_users WHERE rank 5;5. 决策树与常见误区5.1 函数选择决策树是否需要绝对唯一的序号 ├── 是 → 使用row_number └── 否 → 是否允许排名并列 ├── 否 → 使用row_number └── 是 → 是否需要紧凑连续的排名数字 ├── 是 → 使用dense_rank └── 否 → 使用rank5.2 常见错误与解决方法问题1在WHERE中直接使用窗口函数-- 错误写法 SELECT * FROM user_points WHERE RANK() OVER (ORDER BY points DESC) 3; -- 正确写法 SELECT * FROM ( SELECT *, RANK() OVER (ORDER BY points DESC) AS rank FROM user_points ) AS ranked WHERE rank 3;问题2忽略NULL值的影响-- NULL值默认会排在最后ASC或最前DESC -- 可以使用COALESCE处理 SELECT user_id, username, points, RANK() OVER (ORDER BY COALESCE(points, 0) DESC) AS rank FROM user_points;问题3性能问题大数据集-- 对于大型表考虑添加LIMIT SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY points DESC) AS rank FROM user_points -- 先限制数据量再排序 LIMIT 1000 ) AS ranked WHERE rank 100;在实际项目中我发现很多开发者会过度使用row_number仅仅因为它是第一个学到的窗口函数。但理解这三个函数的本质区别后你会发现每种业务场景都有最适合的选择。比如在做分页查询时row_number是必须的但在展示排行榜时rank或dense_rank通常更符合用户预期。

相关文章:

别再傻傻分不清了!用MySQL 8.0实战演示row_number、rank、dense_rank到底怎么选

MySQL 8.0排名函数实战指南:row_number、rank、dense_rank的智能选择 每次面对需要排名的SQL查询时,你是否也在纠结该用哪个窗口函数?row_number、rank还是dense_rank?这三个看似相似的函数,在实际业务场景中却有着截然…...

【仅限前500名】R 4.5专属微生物组分析包清单(含6个未公开CRAN镜像源+3个GitHub高星私有工具链)

更多请点击: https://intelliparadigm.com 第一章:R 4.5微生物组多组学分析环境构建与兼容性验证 在微生物组多组学研究中,R 4.5 版本提供了更稳健的 Bioconductor 3.19 生态支持,但需特别注意其与常用多组学包(如 p…...

告别Abaqus GUI依赖:用类型提示重构有限元分析脚本开发体验

告别Abaqus GUI依赖:用类型提示重构有限元分析脚本开发体验 【免费下载链接】abqpy Type Hints for Abaqus/Python Scripting 项目地址: https://gitcode.com/gh_mirrors/ab/abqpy 在现代工程仿真领域,Abaqus作为行业标准的有限元分析软件&#x…...

数据要素市场亟需“成熟度标尺”!专知智库联合编制100本白皮书,邀您共同定义行业标准

数据要素市场亟需“成熟度标尺”!专知智库联合编制100本白皮书,邀您共同定义行业标准从数据交易所到数据商,从资产评估到安全合规——覆盖十大板块、100本成熟度认证白皮书,构建数据要素市场的完整能力标尺2026年,数据…...

游戏开发内存资源加载与释放策略

游戏开发中的内存资源加载与释放策略是优化性能、提升玩家体验的核心技术之一。随着游戏画面和玩法复杂度的提升,如何高效管理内存资源成为开发者必须面对的挑战。合理的内存策略不仅能减少卡顿和崩溃,还能延长设备续航时间。本文将深入探讨几种关键策略…...

Qianfan-OCR批量处理工具开发:基于Python GUI的桌面应用

Qianfan-OCR批量处理工具开发:基于Python GUI的桌面应用 1. 为什么需要这样一个工具 每天处理大量图片中的文字信息,对很多非技术人员来说是个头疼的问题。想象一下财务人员要录入上百张发票信息,或者档案管理员需要数字化一堆纸质文件&…...

Qwen3-4B-Thinking-Gemini-Distill实际效果:多轮追问中上下文保持与推理一致性验证

Qwen3-4B-Thinking-Gemini-Distill实际效果:多轮追问中上下文保持与推理一致性验证 1. 模型概述 Qwen3-4B-Thinking-2507-Gemini-Distill是基于Qwen3-4B-Thinking-2507的社区蒸馏版本,由TeichAI使用Gemini 2.5 Flash生成的5440万tokens监督微调而成。该…...

2025最权威的六大AI科研助手横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术迅猛发展之下,AI论文网站成了学术写作地方的关键辅助工具&#xff0…...

BepInEx 6.0.0版本在Unity游戏中的稳定性问题如何解决?深度技术解析

BepInEx 6.0.0版本在Unity游戏中的稳定性问题如何解决?深度技术解析 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx作为Unity游戏开发中广泛使用的插件框架和游…...

2025届学术党必备的六大AI科研平台推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 现如今,人工智能技术,于毕业论文写作进程之中,应用愈发广…...

AI 热点资讯日报

文章目录AI 热点资讯日报一、今日核心热点总结二、各来源文章汇总📰 新华网科技📰 36氪📰 虎嗅网📰 网易科技📰 雷锋网三、关键词热度排行四、编辑点评📖 延伸阅读AI 热点资讯日报 日期:2026-0…...

解决 `AttributeError: XLMRobertaTokenizer has no attribute prepare_for_model` 报错的完整指南

文章目录 解决 `cannot import name EncoderDecoderCache` 与 `prepare_for_model` 双重冲突的终极方案 一、问题本质(深度解析) 1. 双重冲突根源 2. 关键证据链 二、精准修复方案(生产环境验证) ✅ 步骤 1:强制安装 精确兼容版本 ✅ 步骤 2:验证关键版本 三、避坑指南(…...

在Debian开发板上搞定TDengine 3.0.2.6服务器安装,Windows客户端+DBeaver连接保姆级教程

在Debian开发板上部署TDengine 3.0与Windows跨平台协同实战 当物联网设备产生的时序数据需要实时处理时,在边缘计算节点部署轻量级时序数据库成为刚需。TDengine作为专为物联网设计的开源时序数据库,其3.0版本在ARM架构设备上的表现尤为亮眼。本文将手把…...

PCB 布局布线,决定硬件成败的关键

原理图设计没问题,板子回来却跑不起来。信号完整性测试一做,振铃、反射、过冲一个不少。反复排查了一个月,最后发现根源在PCB布局——电源和地的走线太细,回流路径被人为阻断,高速信号根本找不到回家的路。 这种事&…...

从WinForms到WPF:一个老C#开发者的UI框架迁移实战与避坑指南

从WinForms到WPF:一个老C#开发者的UI框架迁移实战与避坑指南 当我在2010年第一次接触WPF时,那个闪烁着Vista风格窗口的Demo程序让我眼前一亮——渐变背景、圆角按钮、流畅的动画效果,这些在WinForms中需要耗费大量精力实现的效果,…...

go: Visitor Pattern

项目结构: /* # 版权所有 2026 ©涂聚文有限公司™ # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Visitor Pattern 访问者模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2…...

Fluent新手避坑指南:手把手教你搞定冰块融化模拟(附VOF模型设置要点)

Fluent新手避坑指南:手把手教你搞定冰块融化模拟 1. 为什么你的冰块融化模拟总是失败? 刚接触Fluent的CFD新手们,往往会被看似简单的冰块融化模拟问题难住。明明按照教程一步步操作,却总是遇到计算发散、结果异常的情况。这背后隐…...

Windows和Office激活终极解决方案:KMS_VL_ALL_AIO一键智能激活指南

Windows和Office激活终极解决方案:KMS_VL_ALL_AIO一键智能激活指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗?Office软件突然变成只读…...

douyin-downloader实战:3种高效方案解决抖音内容批量采集难题

douyin-downloader实战:3种高效方案解决抖音内容批量采集难题 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…...

5个步骤将普通望远镜升级为智能天文观测系统:OnStep开源控制器完全指南

5个步骤将普通望远镜升级为智能天文观测系统:OnStep开源控制器完全指南 【免费下载链接】OnStep Arduino telescope goto for equatorial and alt/az mounts 项目地址: https://gitcode.com/gh_mirrors/on/OnStep 你是否曾经仰望星空,梦想拥有一台…...

求求影刀小红书数据批量抓取全攻略原件

求一个原件...

英雄联盟国服免费换肤终极教程:R3nzSkin完整使用指南

英雄联盟国服免费换肤终极教程:R3nzSkin完整使用指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 厌倦了英雄联盟国服中单调的默认皮肤&…...

2025届学术党必备的六大AI辅助写作助手推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网针对人工智能生成内容即AIGC,已构建专项检测系统,此系统用来识别…...

2026年终极指南:如何使用BiliTools轻松下载B站视频和番剧资源

2026年终极指南:如何使用BiliTools轻松下载B站视频和番剧资源 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools…...

道 RAG 基础概念知识点/面试题总结

指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...

Cesium实战:手把手教你实现一个可拖拽编辑的交互式绘图工具(点线面圆矩形)

Cesium交互式绘图工具开发实战:从基础绘制到可编辑图形引擎 在三维地理信息系统开发中,交互式绘图功能已经成为行业标配需求。本文将深入探讨如何基于Cesium构建一个功能完备的绘图工具模块,不仅实现基础的点线面绘制,更重点解决图…...

Talk It 文字转语音:优缺点分析,寻找替代方案

您是否尝试过 Talkit,但发现它难以满足您的文本转语音需求?或者您只是想在安装 Talkit 应用之前了解一下它?无论如何,您都可以在本文中找到答案。我们测试了这款应用以及一些替代方案,并在下文中进行了总结。您可以轻松…...

马斯克起诉OpenAI开庭,索赔最高1800亿美元,案件责任认定5月21日结束

奥尔特曼、布罗克曼到场,马斯克未出席 当地时间4月27日上午,案件如期开庭,进入陪审团遴选阶段。据彭博社报道,奥尔特曼和布罗克曼亲自到场,这对于知名科技高管来说较为罕见,一般不会出庭,马斯克…...

ARM处理器ETB调试系统架构与配置指南

1. ARM RealView ETB调试系统架构解析嵌入式追踪缓冲器(ETT Buffer)作为ARM处理器调试体系的核心组件,其硬件架构由三大部分构成:追踪数据采集单元(ETM)、数据缓冲单元(ETB)以及调试接口单元(JTAG)。在ARM926EJ-S和ARM1136J-S等经典处理器中,…...

Windows 11任务栏歌词插件终极指南:桌面歌词悬浮完整方案

Windows 11任务栏歌词插件终极指南:桌面歌词悬浮完整方案 【免费下载链接】Taskbar-Lyrics BetterNCM插件,在任务栏上嵌入歌词,目前仅建议Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar-Lyrics 还在为听歌时需要频…...