sql rank()函数

本文详细介绍了SQL Server 2005中的四个排名函数(row_number、rank、dense_rank和ntile)的区别和应用,通过实例展示了如何使用这些函数进行数据排序,并特别对比了dense_rank函数与rank函数在生成序号时的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RANK() OVER([<partiton_by_clause>])


  partition_by_clause 将from子句生成的结果集划分为应用到RANK函数的分区。 
  Order_by_clause确定将RANK值应用到分区中的行时所使用的顺序。

 以下用一个成绩表作示例
  table 架构
  s_score(s_class(班级),s_id(学号),s_score(分数))
  SQL statement1:
  Select rank() over(order by s_score desc) as 名次,s_class,s_id,s_score from s_score
  结果集如下
  名次 s_class s_id s_score
  1 二班 S20090733 100
  2 一班 S20090635 99
  3 三班 S20090919 97
  4 一班 S20090846 96
  5 一班 S20090825 95
  6 二班 S20090715 94
  7 三班 S20090836 91
  8 二班 S20090631 86
  SQL statement2:
  Select rank() over(partition by s_class order by s_score desc) as 名次,s_class,s_id,s_score from s_score
  结果集如下
  名次 s_class s_id s_score
  1 三班 S20090919 97
  2 三班 S20090836 91
  1 二班 S20090733 100
  2 二班 S20090715 94
  3 二班 S20090631 86
  1 一班 S20090635 99
  2 一班 S20090846 96
  3 一班 S20090825 95

排名函数是SQL Server2005新加的功能。在SQL Server2005中有如下四个排名函数:

  1.row_number

  2.rank

  3.dense_rank

  4.ntile  

dense_rank

  dense_rank函数的功能与rank函数类似,只是在生成序号时是连续的,而rank函数生成的序号有可能不连续。如上面的例子中如果使用dense_rank函数,第4条记录的序号应该是2,而不是4。如下面的SQL语句所示:

select dense_rank() over(order by field1),* from t_table order by field1

详解:http://www.cnblogs.com/xhyang110/archive/2009/10/27/1590448.html

 

转载于:https://www.cnblogs.com/ilrc/p/5414414.html

### SQLRANK 函数的使用说明 #### 定义与功能 `RANK()` 是一种窗口函数,在 SQL 查询中用于为结果集中的每一行分配一个排名值。该排名基于指定的 `ORDER BY` 子句定义的顺序,当存在相同值时会生成相同的排名,并且后续排名会跳跃以反映重复项的数量[^1]。 #### 基本语法 以下是 `RANK()` 的通用语法: ```sql RANK() OVER ( [PARTITION BY 分组列] ORDER BY 排序列 [ASC | DESC] ) ``` - **PARTITION BY**: 可选参数,用于将数据划分为多个分区,每个分区内独立计算排名。 - **ORDER BY**: 必需参数,定义排名依据的字段及其排序方式(升序或降序)。 --- #### 示例 1:基本排名 假设有一个名为 `employees` 的表,包含以下数据: | employee_id | department | salary | |-------------|------------|--------| | 1 | HR | 5000 | | 2 | IT | 7000 | | 3 | IT | 8000 | | 4 | HR | 6000 | 执行如下查询: ```sql SELECT employee_id, department, salary, RANK() OVER (ORDER BY salary DESC) AS rank_value FROM employees; ``` 返回的结果将是: | employee_id | department | salary | rank_value | |-------------|------------|--------|------------| | 3 | IT | 8000 | 1 | | 2 | IT | 7000 | 2 | | 4 | HR | 6000 | 3 | | 1 | HR | 5000 | 4 | 此示例展示了如何按薪资降序排列并赋予每条记录相应的排名[^2]。 --- #### 示例 2:带 PARTITION BY 的排名 如果希望按照部门对员工进行排名,则可以加入 `PARTITION BY` 子句。例如: ```sql SELECT employee_id, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_value FROM employees; ``` 得到的结果如下: | employee_id | department | salary | rank_value | |-------------|------------|--------|------------| | 1 | HR | 5000 | 2 | | 4 | HR | 6000 | 1 | | 2 | IT | 7000 | 2 | | 3 | IT | 8000 | 1 | 这里可以看到,HR 和 IT 部门分别进行了内部排名[^3]。 --- #### 并列排名处理 当两个或更多行具有相同的排序键值时,它们会被赋予相同的排名,而下一个排名则会跳过相应数量的位置。例如,在上述例子中,如果有两名员工拥有完全一致的薪水,则他们的排名相同,下一排名自动增加一步跨度。 --- #### 应用场景 `RANK()` 函数广泛应用于数据分析领域,尤其是在需要识别前 N 名次或者分析分布情况的时候非常有用。比如找出公司里收入最高的几位雇员、统计考试成绩排行榜等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值