编号函数

row_number ()  仅仅定义组内的数据进行编号   1 2 3 4 
rank()  编号的时候  排序字段会参与编号相同的排序字段 标号一致, 总标号不变
dense_rank()  编号的时候  排序字段会参与编号相同的排序字段标号一致, 总标号有可能变小

初始数据

孙悟空    语文    87
孙悟空    数学    95
娜娜    英语    84
宋宋    语文    64
孙悟空    英语    68
宋宋    英语    84
婷婷    语文    65
娜娜    语文    94
宋宋    数学    86
婷婷    数学    85
娜娜    数学    56
婷婷    英语    78

先建立一个表格,并将数据导入.

create table tb_sub(
name STRING,
subject STRING,
score double
)
row format delimited fields terminated by "\t";
load data local inpath "/home/rank/" into table tb_sub;

对科目及成绩进行排序,顺便给行记个数.初步观察就做好了

row_number ()

select
* ,
row_number()  over(partition by subject  order by score desc) rn
from
tb_sub ;

+--------------+-----------------+---------------+-----+
| tb_sub.name  | tb_sub.subject  | tb_sub.score  | rn  |
+--------------+-----------------+---------------+-----+
| 孙悟空          | 数学              | 95.0          | 1   |
| 宋宋           | 数学              | 86.0          | 2   |
| 婷婷           | 数学              | 85.0          | 3   |
| 娜娜           | 数学              | 56.0          | 4   |
| 宋宋           | 英语              | 84.0          | 1   |
| 娜娜           | 英语              | 84.0          | 2   |
| 婷婷           | 英语              | 78.0          | 3   |
| 孙悟空          | 英语              | 68.0          | 4   |
| 娜娜           | 语文              | 94.0          | 1   |
| 孙悟空          | 语文              | 87.0          | 2   |
| 婷婷           | 语文              | 65.0          | 3   |
| 宋宋           | 语文              | 64.0          | 4   |
+--------------+-----------------+---------------+-----+

成绩单会有两个相同分数,一个第一一个第二吗?应该不会吧,还有老师这样干的?

对代码进行改动,就是一个函数的事,大体已经出来了,改改排序方法不就好了吗.都系毛毛雨拉.

rank()  编号的时候  排序字段会参与编号相同的排序字段 标号一致, 总标号不变

select
*,
rank() over(partition by subject order by score desc) rn
from
tb_sub;

+--------------+-----------------+---------------+-----+
| tb_sub.name  | tb_sub.subject  | tb_sub.score  | rn  |
+--------------+-----------------+---------------+-----+
| 孙悟空          | 数学              | 95.0          | 1   |
| 宋宋           | 数学              | 86.0          | 2   |
| 婷婷           | 数学              | 85.0          | 3   |
| 娜娜           | 数学              | 56.0          | 4   |
| 宋宋           | 英语              | 84.0          | 1   |
| 娜娜           | 英语              | 84.0          | 1   |
| 婷婷           | 英语              | 78.0          | 3   |
| 孙悟空          | 英语              | 68.0          | 4   |
| 娜娜           | 语文              | 94.0          | 1   |
| 孙悟空          | 语文              | 87.0          | 2   |
| 婷婷           | 语文              | 65.0          | 3   |
| 宋宋           | 语文              | 64.0          | 4   |
+--------------+-----------------+---------------+-----+

这里会发现两个成绩相同的同学并齐了.这里发现第三个同学的排序事第三不是第二,有的老师会像这样排,也可能出现前面的学生并列,后面同学往前补的情况

写一下另一种情况

dense_rank()  编号的时候  排序字段会参与编号相同的排序字段标号一致, 总标号有可能变小

select
*,
dense_rank() over(partition by subject order by score desc) rn
from
tb_sub;

+--------------+-----------------+---------------+-----+
| tb_sub.name  | tb_sub.subject  | tb_sub.score  | rn  |
+--------------+-----------------+---------------+-----+
| 孙悟空          | 数学              | 95.0          | 1   |
| 宋宋           | 数学              | 86.0          | 2   |
| 婷婷           | 数学              | 85.0          | 3   |
| 娜娜           | 数学              | 56.0          | 4   |
| 宋宋           | 英语              | 84.0          | 1   |
| 娜娜           | 英语              | 84.0          | 1   |
| 婷婷           | 英语              | 78.0          | 2   |
| 孙悟空          | 英语              | 68.0          | 3   |
| 娜娜           | 语文              | 94.0          | 1   |
| 孙悟空          | 语文              | 87.0          | 2   |
| 婷婷           | 语文              | 65.0          | 3   |
| 宋宋           | 语文              | 64.0          | 4   |
+--------------+-----------------+---------------+-----+

哦了.灵活运用

row_number 给行排序,在相减,可以很好的解决一些查询连续的题

row_number()  over(partition by uid order by seq) rn ,
(seq - (row_number()  over(partition by uid order by seq))) diff

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值