LeetCode SQL 必会的 5 个窗口函数:ROW_NUMBER、RANK、DENSE_RANK、LAG、LEAD 一文搞懂 在刷 LeetCode SQL 时很多题目都会涉及窗口函数Window Function。其中最常用的其实只有 5 个而前三个几乎是每个 SQL 面试都会考察的重点。本文将通过实例讲解这 5 个窗口函数的区别以及适用场景。一、什么是窗口函数普通聚合函数如SUM()、COUNT()会把多行数据聚合成一行。例如SELECT COUNT(*) FROM Employee;返回count10而窗口函数不会减少数据行数而是在保留每一行的基础上计算一个新的结果。例如SELECT name, salary, ROW_NUMBER() OVER(ORDER BY salary DESC) FROM Employee;结果namesalaryrow_numberMax900001Joe850002Henry800003可以看到每一行仍然保留只是多了一列排名。二、5 个最常用的窗口函数1. ROW_NUMBER() —— 连续编号作用给每一行分配唯一编号。SELECT name, salary, ROW_NUMBER() OVER( ORDER BY salary DESC ) AS rn FROM Employee;假设工资如下salary90000850008500069000结果salaryrn900001850002850003690004特点每个人编号唯一即使工资相同也不会并列适用场景每组第一条数据去重最新一条记录2. RANK() —— 排名作用相同值并列但后面的排名会跳号。SELECT salary, RANK() OVER( ORDER BY salary DESC ) AS rnk FROM Employee;结果salaryrank900001850002850002690004注意由于两个员工都是第二名因此下一位直接变成第四名。这就是所谓的跳号排名。3. DENSE_RANK() —— 密集排名作用相同值并列但不会跳号。SELECT salary, DENSE_RANK() OVER( ORDER BY salary DESC ) AS rnk FROM Employee;结果salarydense_rank900001850002850002690003特点相同值排名一致后续排名连续LeetCode 中的「部门工资前三高员工」等题目基本都会使用DENSE_RANK()。例如DENSE_RANK() OVER( PARTITION BY department_id ORDER BY salary DESC )表示每个部门分别进行工资排名。4. LAG() —— 获取上一行数据作用获取当前行前面的第 N 行数据。例如daysales110021503200SQLSELECT day, sales, LAG(sales) OVER( ORDER BY day ) AS prev_sales FROM Sales;结果daysalesprev_sales1100NULL21501003200150常见应用连续登录连续数字环比增长股票涨跌5. LEAD() —— 获取下一行数据作用获取当前行后面的第 N 行数据。SELECT day, sales, LEAD(sales) OVER( ORDER BY day ) AS next_sales FROM Sales;结果daysalesnext_sales110015021502003200NULL常见应用判断下一天是否登录判断下一条记录连续区间问题三、三种排名函数对比假设工资如下salary90000850008500069000ROW_NUMBER()salary结果900001850002850003690004特点不管是否相同编号都不同。RANK()salary结果900001850002850002690004特点相同值并列。后面跳号。DENSE_RANK()salary结果900001850002850002690003特点相同值并列。不跳号。四、如何选择如果你的需求是每条记录一个唯一编号 →ROW_NUMBER()比赛排名允许跳号 →RANK()工资排名、前 N 高不跳号 →DENSE_RANK()获取上一条记录 →LAG()获取下一条记录 →LEAD()五、LeetCode 高频考点下面是刷 LeetCode SQL 时最常见的窗口函数应用函数典型题目ROW_NUMBER()每组第一条数据、去重RANK()比赛排名、成绩排名DENSE_RANK()部门工资前三高、Top N 问题LAG()连续登录、连续数字LEAD()下一次登录、下一条记录其中ROW_NUMBER()、DENSE_RANK()和LAG()的出题频率最高建议优先掌握。总结窗口函数最大的特点就是不减少数据行数而是在每一行上计算一个新的统计结果。记住下面这张表即可函数作用相同值处理ROW_NUMBER()连续编号编号不同RANK()排名并列后面跳号DENSE_RANK()密集排名并列不跳号LAG()上一行数据不是排名LEAD()下一行数据不是排名掌握这 5 个窗口函数基本可以解决 LeetCode SQL 中绝大多数涉及排名、连续记录和 Top N 的题目。

相关新闻

最新新闻

【工作杂谈_20260817】多维分析与数据建模: 维度上卷:从明细粒度到汇总层级

【工作杂谈_20260817】多维分析与数据建模: 维度上卷:从明细粒度到汇总层级

文章目录1. 什么是“维度上卷”2. ETL 中上卷的核心是“改变事实粒度”3. ETL 中上卷的完整流程3.1 数据质量检查3.2 加载维表地域维表 DimGeography日期维表 DimDate产品表 DimProduct3.3 生成明细事实表3.4 预聚合上卷上卷一:Date → Month上卷二:City…

2026/8/29 5:06:13
MATLAB在自动控制中的核心应用:从模型构建到控制器设计实战

MATLAB在自动控制中的核心应用:从模型构建到控制器设计实战

1. 从“纸上谈兵”到“动手验证”:为什么自动控制离不开MATLAB搞自动控制的人,如果没在MATLAB里折腾过几个传递函数、画过几张根轨迹图,那感觉就像厨师没摸过炒锅一样,总少了点实战的底气。我当年学自控原理的时候,课本…

2026/8/29 5:06:13
EtherCAT(通信/传输层)学习笔记

EtherCAT(通信/传输层)学习笔记

基本概念processing on the fly:这是 EtherCAT 和普通以太网的本质区别:数据帧不需要在每个从站里被完整接收、处理、再转发,而是帧经过从站硬件时被实时读写,帧持续流动。WKC(Working Counter)的主要功能在…

2026/8/29 5:06:13
为什么SAP难用、贵、实施慢,却还有那么多大公司离不开它?

为什么SAP难用、贵、实施慢,却还有那么多大公司离不开它?

”SAP到底有什么魔力?“ 明明出了名的难用,价格不低,实施周期还长,为什么全球那么多大型企业,尤其是制造业巨头,依然离不开它? 很多业务人员第一次接触SAP,都会有类似的疑问&#…

2026/8/29 5:06:13
远程操作电脑的软件 远程电脑控制怎么操作

远程操作电脑的软件 远程电脑控制怎么操作

远程操作电脑的软件选择不少,但实际使用时很容易遇到各类麻烦,有的配对流程复杂,有的延迟高。远程操作电脑的软件想要做到省心好用,不能只看表面功能,无界趣连2.0在实际使用当中表现亮眼,不管是日常调取文件…

2026/8/29 5:06:13
AI辅助基金申请:赢面更大,但正在窄化你的研究思路

AI辅助基金申请:赢面更大,但正在窄化你的研究思路

最近半年,我身边不少做科研的朋友都在用 AI 辅助撰写基金申请书(grant proposal)。最开始是帮忙润色摘要,后来是直接给出整段研究背景,再后来甚至有人把“研究意义”和“技术路线”的初稿都交给大模型生成。反馈很分裂…

2026/8/29 5:01:13