使用RANK函数统计排行榜

本文介绍了如何使用Oracle中的RANK函数来进行数据排名,并通过示例对比了RANK与DENSE_RANK的区别。此外,还展示了如何结合PARTITION BY进行分组排名。
 

使用RANK函数统计排行榜

RANK是一个从oracle 8.1.6开始引入的统计函数。RANK的功能是按照某种分组方式计算出返回结果的排行。RANK函数有两个,一个是RANK,另外一个是DENSE_RANKRANK排序在碰到并列值的时候,下一个排行序号会跳过并列的值,而DENSE_RANK排序的结果有并列排名,下一个排行顺序仅仅加一。

 

比如:

SQL> SELECT year, region, profit,dept ,

  2      RANK() OVER ( ORDER BY profit DESC) as rk

  3     FROM test;

 

YEAR REGION      PROFIT DE         RK

---- ------- ---------- -- ----------

2004 East           103 A2          1

2003 East           102 A1          2

2003 Central        101 A1          3

2003 Central        100 A2          4

2004 West            89 A2          5

2003 West            88 A1          6

2003 West            88 A2          6

2004 West            77 A1          8

2004 West            77 A1          8

使用DENSE_RANK排名的结果为:

SQL> SELECT year, region, profit,dept ,

  2      DENSE_RANK() OVER ( ORDER BY profit DESC) as rk

  3     FROM test;

YEAR REGION      PROFIT DE         RK

---- ------- ---------- -- ----------

2004 East           103 A2          1

2003 East           102 A1          2

2003 Central        101 A1          3

2003 Central        100 A2          4

2004 West            89 A2          5

2003 West            88 A1          6

2003 West            88 A2          6

2004 West            77 A1          7

上面的例子是按照PROFIT进行排名。RANK函数支持分组排名,比如我们可以按照年份分组,然后计算排名:

SQL> SELECT year, region, profit,dept ,

  2 RANK() OVER (PARTITION BY year ORDER BY profit DESC,REGION) as rk

  3     FROM test;

 

YEAR REGION      PROFIT DE         RK

---- ------- ---------- -- ----------

2003 East           102 A1          1

2003 Central        101 A1          2

2003 Central        100 A2          3

2003 West            99 A2          4

2003 West            88 A1          5

2004 East           103 A2          1

2004 West            89 A2          2

2004 West            77 A1          3

这个查询首先对数据按照年份分组,然后在分组中计算排名。

### 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 名次或者分析分布情况的时候非常有用。比如找出公司里收入最高的几雇员、统计考试成绩排行榜等等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值