
全局编号不分组ROW_NUMBER() 是 SQL 中一个非常重要的窗口函数Window Function用于为查询结果集中的每一行生成唯一的、连续的整数序号从 1 开始。ROW_NUMBER()OVER([PARTITIONBY分组字段]ORDERBY排序字段[ASC|DESC])特性说明唯一性每一行都有唯一的行号即使排序字段值相同连续性行号是 1, 2, 3, … 连续递增依赖排序行号顺序由ORDER BY决定支持分组用PARTITION BY可在每个分组内重新从 1 开始编号注意ROW_NUMBER() 只影响行号生成逻辑不改变最终结果集的物理顺序。如果你想让查询结果也按某个顺序显示仍需在主查询中加 ORDER BYSELECTname,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_rank1Alice900011Bob800022Carol850012Dave70002获取每组前 N 条记录经典用法-- 获取每个部门薪资最高的 1 人WITHRankedEmpAS(SELECTdept_id,name,salary,ROW_NUMBER()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASrnFROMemployees)SELECTdept_id,name,salaryFROMRankedEmpWHERErn1;这是 SQL 中实现“Top-N per Group”最常用的方法。WITH … AS这里 AS 后面是查询语句作为一个结果(可以当做一个表) 给后面的SELECT使用RANK() / DENSE_RANK()函数相同值处理示例值100, 100, 90ROW_NUMBER()强制唯一1, 2, 3RANK()并列跳过后续1, 1, 3DENSE_RANK()并列不跳过1, 1, 2