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