Oracle并列排名显示

转载地址:https://blog.youkuaiyun.com/WXB52112181314/article/details/80838567
第一种:dense_rank() over (order by 字段 升序或降序) as 别名 from 表名;
使用别名方便之后过滤条件使用;

排名的时候并列算同一个人,如,1,2,2,3

SQL> select ename,job,sal,dense_rank() over(order by sal desc) as rank from emp;

ENAME JOB SAL RANK


KING PRESIDENT 5000 1
FORD ANALYST 3000 2
SCOTT ANALYST 3000 2
JONES MANAGER 2975 3
BLAKE MANAGER 2850 4
CLARK MANAGER 2450 5
ALLEN SALESMAN 1600 6
TURNER SALESMAN 1500 7
ADAMS CLERK 1400 8
SMITH CLERK 1400 8
MILLER CLERK 1300 9
WARD SALESMAN 1250 10
MARTIN SALESMAN 1250 10
JAMES CLERK 950 11

已选择14行。
比如限制条件为 排名第二的员工,并列的都显示出来:
SQL> select * from (select ename,job,sal,dense_rank() over(order by sal desc) as rank from emp) where rank =2;

ENAME JOB SAL RANK


SCOTT ANALYST 3000 2
FORD ANALYST 3000 2

第二种:rank() over (order by 字段名 升序或者降序) as 别名 from 表名;
排名的时候,并列多少个人,序号就算多少个,如:1,2,2,4

SQL> select ename,job,sal,rank() over(order by sal desc) as rank from emp;

ENAME JOB SAL RANK


KING PRESIDENT 5000 1
FORD ANALYST 3000 2
SCOTT ANALYST 3000 2
JONES MANAGER 2975 4
BLAKE MANAGER 2850 5
CLARK MANAGER 2450 6
ALLEN SALESMAN 1600 7
TURNER SALESMAN 1500 8
ADAMS CLERK 1400 9
SMITH CLERK 1400 9
MILLER CLERK 1300 11
WARD SALESMAN 1250 12
MARTIN SALESMAN 1250 12
JAMES CLERK 950 14

已选择14行。
第三种:row_number() over (order by 字段名 升序或降序) as 别名 from 表名;
这种就是不分并列,直接按序号来排名,如:1,2,3,4

SQL> select ename,job,sal,row_number() over(order by sal desc) as rank from emp;

ENAME JOB SAL RANK


KING PRESIDENT 5000 1
FORD ANALYST 3000 2
SCOTT ANALYST 3000 3
JONES MANAGER 2975 4
BLAKE MANAGER 2850 5
CLARK MANAGER 2450 6
ALLEN SALESMAN 1600 7
TURNER SALESMAN 1500 8
ADAMS CLERK 1400 9
SMITH CLERK 1400 10
MILLER CLERK 1300 11
WARD SALESMAN 1250 12
MARTIN SALESMAN 1250 13
JAMES CLERK 950 14

已选择14行。

作者:奥利奥小兵
来源:优快云
原文:https://blog.youkuaiyun.com/WXB52112181314/article/details/80838567
版权声明:本文为博主原创文章,转载请附上博文链接!

RANK函数是Oracle数据库中用于排序的重要函数,其功能是为结果集中的每一行分配一个排名,且在处理并列排名时会跳过相应的名次。 ### 使用方法 RANK函数的基本语法为:`RANK() OVER (PARTITION BY partition_expression ORDER BY sort_expression [ASC|DESC])` 。 - `PARTITION BY` 子句用于将结果集划分为多个分区,在每个分区内进行排名操作。如果省略该子句,则将整个结果集视为一个分区。 - `ORDER BY` 子句用于指定排名的依据列,可使用 `ASC`(升序,默认)或 `DESC`(降序)来确定排序方向。 ### 示例 #### 按成绩进行排名 假设有一个学生成绩表 `t_ygy_demo_score`,包含 `id`、`name`、`course`、`score` 等字段,要对所有学生的成绩进行排名: ```sql SELECT id, name, course, score, RANK() OVER (ORDER BY score DESC) as rank FROM t_ygy_demo_score; ``` 此查询会根据成绩从高到低对所有学生进行排名,成绩相同的学生排名相同,下一个排名会跳过相应的名次。 #### 获取排名前五的数据 若要获取成绩排名前五的学生信息: ```sql SELECT * FROM ( SELECT id, name, course, score, RANK() OVER (ORDER BY score DESC) as rank FROM t_ygy_demo_score ) WHERE rank <= 5; ``` 该查询先对学生成绩进行排名,然后筛选出排名在前五的学生信息。 #### 分组后再排名 若要按照课程对学生成绩进行分组排名,找出每个课程中成绩排名第一的学生: ```sql SELECT * FROM ( SELECT id, name, course, score, RANK() OVER (PARTITION BY course ORDER BY score DESC) as rank FROM t_ygy_demo_score ) rs WHERE rs.rank = 1; ``` 此查询按课程将学生成绩分组,在每个课程组内按成绩降序排名,最后筛选出每个课程中排名第一的学生信息 [^1][^3]。 #### 与DENSE_RANK对比示例 为了更清晰地展示RANK函数处理并列排名的方式,与 `DENSE_RANK` 函数进行对比: ```sql SELECT employee_id, first_name, last_name, salary, RANK() OVER (ORDER BY salary DESC) as rank, DENSE_RANK() OVER (ORDER BY salary DESC) as dense_rank FROM employees; ``` 该查询会同时显示 `RANK` 和 `DENSE_RANK` 两种排名结果,对比可以发现 `RANK` 函数在处理并列排名时会跳过名次,而 `DENSE_RANK` 函数不会跳过名次 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值