SQL server中row_number(),rank(),dense_rank()排序
drop table if exists SC; create table SC( Sno char(10), Cno char(10), Grade smallint not null, constraint pk_sno primary key (sno,cno) ) 首先简单创建一个表,并为其插入主码 Insert Into SC (Sno ,Cno,Grade) Values ('2000011111','1000000001',88), ('2000011111','1000000004',88) 并向其中插入一些数据,这里简单示范 在SQL Server中,排序是数据分析和数据处理过程中非常常见的需求。`row_number()`, `rank()`, 和 `dense_rank()` 是三个重要的窗口函数,用于为查询结果集中的每一行分配唯一的序列号,常用于分组、排名或者实现分区排序。下面我们将详细探讨这三个函数的区别和用法。 1. `row_number()` `row_number()` 函数为查询结果集中的每一行返回一个唯一的整数,通常基于特定的排序标准。这个序列号是从1开始递增的。在创建示例表SC之后,我们可以使用`row_number()`来对某一列进行排序并生成序列: ```sql SELECT Sno, Cno, Grade, ROW_NUMBER() OVER (ORDER BY Grade DESC) AS RowNum FROM SC; ``` 上述查询将按照Grade降序为每一行分配一个RowNum,成绩越高,编号越小。 2. `rank()` `rank()` 函数也返回一个唯一的整数,但当有相同的值时,它会跳过某些数字。如果在排序列中有两个或更多的行具有相同值,它们将被分配相同的排名,然后排名值会跳过相应数量的数字。例如,如果有两行Grade都是88,它们都会被赋予相同的Rank,而下一行即使Grade与它们不同,Rank也将是相同的值,而非连续的整数。 ```sql SELECT Sno, Cno, Grade, RANK() OVER (ORDER BY Grade DESC) AS RankNum FROM SC; ``` 3. `dense_rank()` `dense_rank()` 与`rank()`类似,也是在遇到相同值时不会跳过编号,但它不会留下空缺。换句话说,如果有多行具有相同的值,它们将获得相同的排名,但紧接着的排名将是连续的,不会跳过任何数字。 ```sql SELECT Sno, Cno, Grade, DENSE_RANK() OVER (ORDER BY Grade DESC) AS DenseRankNum FROM SC; ``` 总结来说,`row_number()` 每行都有唯一的数字,无论值是否相同;`rank()` 在遇到相同值时会跳过编号,而`dense_rank()` 则会保持排名连续,不产生空缺。这三种函数在实际应用中可以根据需求选择,如需保证排名的连续性,`dense_rank()` 是更好的选择;如果希望每个组内部的行有唯一的标识,`row_number()` 更合适;而`rank()` 在处理竞赛排名等场景时较为常见,因为它能体现相同名次间的差距。在处理大数据时,这些窗口函数可以有效地帮助我们进行复杂的分析和处理。
























- 粉丝: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 广东省电子商务认证有限公司.ppt
- 自动化考试试题.doc
- 2023年师德师风法律法规网络竞赛题.doc
- 三G网络互操作优化原则和优化方案.doc
- 人工智能及其应用实验指导书.doc
- 医学西门子PLC故障诊断简易教程专题.ppt
- 小学生计算机辅助教学系统试题.doc
- 游戏开发团队建设ppt免费.pptx
- C语言期末试卷1.pdf
- 2022年电大C语言程序设计作业答案剖析.doc
- 有关软件工程的实习报告.docx
- 网络直销模式案例分析.ppt
- 项目管理班子配备.doc
- 论网络跳蚤市场对电子商务发展的影响.docx
- 某公司网络广告策划书.doc
- 基于单片机的十字路口交通信号灯控制-毕业设计论文.doc


