news 2026/7/1 8:31:12

sql语法 - WITH, ROW_NUMBER, 经典用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
sql语法 - WITH, ROW_NUMBER, 经典用法

全局编号(不分组)

ROW_NUMBER() 是 SQL 中一个非常重要的窗口函数(Window Function),用于为查询结果集中的每一行生成唯一的、连续的整数序号(从 1 开始)。

ROW_NUMBER()OVER([PARTITIONBY分组字段]ORDERBY排序字段[ASC|DESC])
特性说明
唯一性每一行都有唯一的行号,即使排序字段值相同
连续性行号是 1, 2, 3, … 连续递增
依赖排序行号顺序由ORDER BY决定
支持分组PARTITION BY可在每个分组内重新从 1 开始编号

注意:ROW_NUMBER() 只影响行号生成逻辑,不改变最终结果集的物理顺序。
如果你想让查询结果也按某个顺序显示,仍需在主查询中加 ORDER BY

SELECTname,salary,ROW_NUMBER()OVER(ORDERBYsalaryDESCNULLSLAST)ASrnFROMemployees;

NULLS LAST 表示如果salary 字段为null 就放在最后

对比 RANK()或 DENSE_RANK():它们会在相同值时产生并列排名(如两个第2名),但 ROW_NUMBER()永远不重复

分组编号(按部门排名)

SELECTdept_id,name,salary,ROW_NUMBER()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASdept_rankFROMemployees;
dept_idnamesalarydept_rank
1Alice90001
1Bob80002
2Carol85001
2Dave70002

获取每组前 N 条记录(经典用法)

-- 获取每个部门薪资最高的 1 人WITHRankedEmpAS(SELECTdept_id,name,salary,ROW_NUMBER()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASrnFROMemployees)SELECTdept_id,name,salaryFROMRankedEmpWHERErn=1;

这是 SQL 中实现“Top-N per Group”最常用的方法。

WITH … AS
这里 AS 后面是查询语句作为一个结果(可以当做一个表) 给后面的SELECT使用

RANK() / DENSE_RANK()

函数相同值处理示例(值:100, 100, 90)
ROW_NUMBER()强制唯一1, 2, 3
RANK()并列,跳过后续1, 1, 3
DENSE_RANK()并列,不跳过1, 1, 2
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 8:31:03

如何轻松重置JetBrains IDE试用期:专业开发者的完整解决方案

如何轻松重置JetBrains IDE试用期:专业开发者的完整解决方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置工具(ide-eval-resetter)是一款专门为开发…

作者头像 李华
网站建设 2026/7/1 8:29:10

Platinum-MD:终极免费工具,让经典MiniDisc重获新生

Platinum-MD:终极免费工具,让经典MiniDisc重获新生 【免费下载链接】platinum-md Minidisc NetMD Conversion and Upload 项目地址: https://gitcode.com/gh_mirrors/pl/platinum-md MiniDisc无损音乐管理工具Platinum-MD为音乐爱好者带来了革命性…

作者头像 李华
网站建设 2026/7/1 8:28:43

MATLAB 2022a实战:手把手教你搭建MSK通信链路并对比三种解调器性能

MATLAB 2022a实战:从零构建MSK通信链路与解调器性能深度评测引言:为什么选择MSK调制?在数字通信领域,调制技术决定了信号如何在有限带宽内高效传输。MSK(最小频移键控)作为一种特殊的连续相位频移键控&…

作者头像 李华