SQL窗口函数:row_number与rank的应用.docxVIP

  • 0
  • 0
  • 约4.42千字
  • 约 10页
  • 2026-01-29 发布于江苏
  • 举报

SQL窗口函数:row_number与rank的应用

引言

在数据处理与分析领域,SQL是最常用的工具之一。随着业务需求的复杂化,传统的聚合函数和单表查询逐渐难以满足精细化分析的要求,窗口函数(WindowFunction)应运而生。它如同给数据打开了一扇“动态观察窗”,能在不改变原始数据行的前提下,对特定范围内的数据进行计算,尤其在排序、分组统计、趋势分析等场景中表现优异。

在众多窗口函数中,row_number与rank是最基础也最常用的两个。它们都能为数据行生成序号,但在具体行为上存在关键差异。理解二者的特性并灵活运用,是掌握窗口函数的重要一步。本文将从基础概念出发,结合实际场景,深入解析row_number与rank的应用逻辑,帮助读者在实际工作中精准选择工具,提升数据处理效率。

一、窗口函数与row_number、rank的基础认知

(一)窗口函数的核心逻辑

要理解row_number与rank,首先需要明确窗口函数的基本概念。简单来说,窗口函数会为每一行数据定义一个“窗口”(即数据范围),并在这个窗口内执行计算。这个窗口可以是全表数据,也可以通过PARTITIONBY子句按某字段分组(类似GROUPBY,但不会合并行),还能通过ORDERBY子句指定排序规则。

窗口函数的关键特征在于“保留原始行”。例如,使用SUM()作为窗口函数时,不会像GROUPBY那样将多行合并为一行,而是为每一行返回其窗口内的总和。这种特性使得窗口函数在需要“既显示明细数据,又展示汇总信息”的场景中不可替代。

(二)row_number与rank的定义与基础语法

row_number的字面意思是“行号”,它的核心作用是为窗口内的每一行生成唯一的序号。无论数据是否重复,row_number都会严格按照排序规则分配1、2、3……的连续序号,且不会出现重复值。例如,在按工资排序的员工表中,即使有两人工资相同,row_number也会为他们分配不同的序号。

rank的中文含义是“排名”,它的行为与日常理解的“排名”更接近:当排序字段值相同时,相同值的行会获得相同的排名,且后续序号会跳过重复的数量。例如,若有两人并列第1名,下一行会直接是第3名(而非第2名)。

二者的基础语法高度相似,均遵循窗口函数的通用结构:

sql

函数名()OVER(

[PARTITIONBY分区字段]

[ORDERBY排序字段[ASC/DESC]]

)

其中,PARTITIONBY可选,用于将数据按字段分组,每组内独立计算序号;ORDERBY必选,用于指定排序规则(升序或降序)。

(三)一个简单的对比示例

为了更直观地理解二者差异,我们假设存在一张“员工表”,包含“员工ID”“姓名”“部门”“月薪”四个字段,部分数据如下:

员工1:销售部,月薪15000元

员工2:销售部,月薪18000元

员工3:销售部,月薪18000元

员工4:销售部,月薪16000元

若要计算销售部员工的月薪排名,使用row_number与rank的结果会有明显差异:

row_number结果:员工2(1)、员工3(2)、员工1(3)、员工4(4)(假设按月薪降序排序)

rank结果:员工2(1)、员工3(1)、员工1(3)、员工4(4)(因为员工2和3月薪相同,并列第1,下一名直接是第3)

这个例子清晰展示了二者的核心区别:row_number追求“绝对唯一序号”,rank则保留“并列排名”的现实逻辑。

二、row_number与rank的核心差异解析

(一)序号连续性与重复性的本质区别

row_number的“唯一性”是其最显著的特征。无论排序字段是否存在重复值,它都会严格按照ORDERBY的顺序分配连续且不重复的序号。这种特性使得row_number在需要“唯一标识行顺序”的场景中不可替代,例如生成操作日志的顺序号、为重复数据打唯一标签等。

rank的“可重复性”则更贴近现实中的排名逻辑。例如,考试成绩中若有两人并列第一,第三名的序号自然是3而非2。这种设计使得rank在需要反映“实际排名关系”的场景中更合理,例如销售业绩排名、竞赛评分统计等。

(二)对后续序号的影响差异

当存在重复值时,二者对后续序号的处理方式完全不同。以“月薪18000元有2人”的场景为例:

row_number会为这2人分配1和2的序号,后续员工的序号依次递增(3、4……)。

rank会为这2人分配1的序号,下一个不同值的员工序号为1+重复数量=3(即跳过了2)。

这种差异直接影响后续数据的分析结论。例如,若需要筛选“前3名员工”,使用rank时可能实际得到2人(前两名并列第1,第三名是第3名),而row_number则严格返回前3行数据。

(三)应用场景的初步划分

基于上述差异,二者的典型应用

文档评论(0)

1亿VIP精品文档

相关文档