mysql8.0窗口函数:rank,dense_rank,row_number 使用上的区别

本节主要介绍排序类 rank,dense_rank,row_number使用上的区别

*RANK:跳跃排序
DENSE_RANK:连续排序
row_number:没有重复值的排序[记录相等也是不重复的]可以进行分页使用。
*
案例:

root@my3308.sock-8.0.11>[test]>select * from window_test;
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    1 | 小黄   | 数学    |   100 |
|    2 | 小黄   | 语文    |    90 |
|    3 | 小黄   | 英语    |    80 |
|    4 | 小黄   | 物理    |   100 |
|    5 | 小黄   | 化学    |    99 |
|    6 | 小红   | 数学    |    90 |
|    7 | 小红   | 语文    |   100 |
|    8 | 小红   | 英语    |    80 |
|    9 | 小红   | 物理    |    90 |
|   10 | 小红   | 化学    |    70 |
|   11 | 小绿   | 数学    |    90 |
|   12 | 小绿   | 语文    |    92 |
|   13 | 小绿   | 英语    |    93 |
|   14 | 小绿   | 物理    |    94 |
|   15 | 小绿   | 化学    |    95 |
|   16 | 小青   | 数学    |    30 |
|   17 | 小青   | 语文    |   100 |
|   17 | 小青   | 英语    |    70 |
|   17 | 小青   | 物理    |    88 |
|   17 | 小青   | 化学    |    96 |
+------+--------+---------+-------+
20 rows in set (0.00 sec)

rank :跳跃式的排序:

image

dense_rank:连续排序

image

row_number:没有重复值的排序[记录相等也是不重复的]可以进行分页使用

root@my3308.sock-8.0.11>[test]>select *,row_number()  over(partition by subject order by score desc) as 'rank' from window_test;
+------+--------+---------+-------+------+
| id   | name   | subject | score | rank |
+------+--------+---------+-------+------+
|    5 | 小黄   | 化学    |    99 |    1 |
|   17 | 小青   | 化学    |    96 |    2 |
|   15 | 小绿   | 化学    |    95 |    3 |
|   10 | 小红   | 化学    |    70 |    4 |
|    1 | 小黄   | 数学    |   100 |    1 |
|    6 | 小红   | 数学    |    90 |    2 |
|   11 | 小绿   | 数学    |    90 |    3 |
|   16 | 小青   | 数学    |    30 |    4 |
|    4 | 小黄   | 物理    |   100 |    1 |
|   14 | 小绿   | 物理    |    94 |    2 |
|    9 | 小红   | 物理    |    90 |    3 |
|   17 | 小青   | 物理    |    88 |    4 |
|   13 | 小绿   | 英语    |    93 |    1 |
|    3 | 小黄   | 英语    |    80 |    2 |
|    8 | 小红   | 英语    |    80 |    3 |
|   17 | 小青   | 英语    |    70 |    4 |
|    7 | 小红   | 语文    |   100 |    1 |
|   17 | 小青   | 语文    |   100 |    2 |
|   12 | 小绿   | 语文    |    92 |    3 |
|    2 | 小黄   | 语文    |    90 |    4 |
+------+--------+---------+-------+------+
20 rows in set (0.00 sec)

--rank:数学成绩90 排第几名:

root@my3308.sock-8.0.11>[test]>select * from window_test where subject='数学' order by score desc;
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    1 | 小黄   | 数学    |   100 |
|    6 | 小红   | 数学    |    90 |
|   11 | 小绿   | 数学    |    90 |
|   16 | 小青   | 数学    |    30 |
+------+--------+---------+-------+
4 rows in set (0.00 sec)

root@my3308.sock-8.0.11>[test]>select * from (
select *,rank() over(partition by subject order by score desc
) as 'rank' from window_test) x 
where  x.subject='数学' and   x.score=90;
+------+--------+---------+-------+------+
| id   | name   | subject | score | rank |
+------+--------+---------+-------+------+
|    6 | 小红   | 数学    |    90 |    2 |
|   11 | 小绿   | 数学    |    90 |    2 |
+------+--------+---------+-------+------+
2 rows in set (0.00 sec)

--dense_rank:查询每门课的前2名:

root@my3308.sock-8.0.11>[test]>select name,subject,score from (select *,dense_rank()  over(partition by subject order by score desc) as 'rank' from window_test) x where x.rank<=2;
+--------+---------+-------+
| name   | subject | score |
+--------+---------+-------+
| 小黄   | 化学    |    99 |
| 小青   | 化学    |    96 |
| 小黄   | 数学    |   100 |
| 小红   | 数学    |    90 |
| 小绿   | 数学    |    90 |
| 小黄   | 物理    |   100 |
| 小绿   | 物理    |    94 |
| 小绿   | 英语    |    93 |
| 小黄   | 英语    |    80 |
| 小红   | 英语    |    80 |
| 小红   | 语文    |   100 |
| 小青   | 语文    |   100 |
| 小绿   | 语文    |    92 |
+--------+---------+-------+
13 rows in set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值