资讯专栏INFORMATION COLUMN

sql排序之rank,row_number,dense_rank的区别

darkbug / 642人阅读

摘要:创建测试表给测试表插入数据张飞一年一班刘备一年一班李逵一年一班小动一年一班小智一年一班吕布一年二班赵云一年二班典韦一年二班关羽一年二班马超一年二班张媛一年一班不管在,还是在版的中,在排序的时候都可以用到三个函数,,列出每个班分数

--创建测试表
create table te.sc(id int, name varchar(20),class varchar(20), score int);

--给测试表插入数据
insert into te.sc values (1,"张飞","一年一班",100);
insert into te.sc values (2,"刘备","一年一班",99);
insert into te.sc values (3,"李逵","一年一班",95);
insert into te.sc values (4,"小动","一年一班",97);
insert into te.sc values (5,"小智","一年一班",80);
insert into te.sc values (6,"吕布","一年二班",67);
insert into te.sc values (7,"赵云","一年二班",90);
insert into te.sc values (8,"典韦","一年二班",89);
insert into te.sc values (9,"关羽","一年二班",70);
insert into te.sc values (10,"马超","一年二班",98);
insert into te.sc values (11,"张媛","一年一班",100);

不管在oracle,还是在8.0版的mysql中,在排序的时候都可以用到三个函数:rank,row_number,dense_rank

--列出每个班分数排名前三的学生
    select * from (select id, name, class, score , 
                row_number() over (partition by class order by score desc) as r1,
                rank() over (partition by class order by score desc) as r2 ,
                dense_rank() over (partition by class order by score desc) as r3 from te.sc) B where r1<=3 ;

id     name     class     score     r1   r2   r3
1      张飞    一年一班    100        1    1    1
11     张媛    一年一班    100        2    1    1
2      刘备    一年一班    99         3    3    2
10     马超    一年二班    98         1    1    1
7      赵云    一年二班    90         2    2    2
8      典韦    一年二班    89         3    3    3

这三个函数的区别主要在分数一致的情况下,row_number()不重复排序,rank()重复且跳数字排序,dense_rank()重复且不跳数字排序。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/48535.html

相关文章

  • sql排序rankrow_number,dense_rank区别

    摘要:创建测试表给测试表插入数据张飞一年一班刘备一年一班李逵一年一班小动一年一班小智一年一班吕布一年二班赵云一年二班典韦一年二班关羽一年二班马超一年二班张媛一年一班不管在,还是在版的中,在排序的时候都可以用到三个函数,,列出每个班分数 --创建测试表 create table te.sc(id int, name varchar(20),class varchar(20), score in...

    netScorpion 评论0 收藏0
  • Postgresql窗口函数(二)

    摘要:在上一篇里,主要窗口函数的基本用法。在这一篇中,我们来看看除了聚合函数之外还支持哪些窗口函数吧。注意到虽然为和的员工,相同,但返回的行号仍然连续。返回分组后的行号,但和和函数都不同,当对比值重复时行号重复但不间断。 在上一篇里,主要窗口函数的基本用法。 在这一篇中,我们来看看postgresql除了聚合函数之外还支持哪些窗口函数吧。 row_number() 返回分组后的行号。注意到虽...

    Achilles 评论0 收藏0
  • Postgresql窗口函数(二)

    摘要:在上一篇里,主要窗口函数的基本用法。在这一篇中,我们来看看除了聚合函数之外还支持哪些窗口函数吧。注意到虽然为和的员工,相同,但返回的行号仍然连续。返回分组后的行号,但和和函数都不同,当对比值重复时行号重复但不间断。 在上一篇里,主要窗口函数的基本用法。 在这一篇中,我们来看看postgresql除了聚合函数之外还支持哪些窗口函数吧。 row_number() 返回分组后的行号。注意到虽...

    i_garfileo 评论0 收藏0
  • Postgresql窗口函数(二)

    摘要:在上一篇里,主要窗口函数的基本用法。在这一篇中,我们来看看除了聚合函数之外还支持哪些窗口函数吧。注意到虽然为和的员工,相同,但返回的行号仍然连续。返回分组后的行号,但和和函数都不同,当对比值重复时行号重复但不间断。 在上一篇里,主要窗口函数的基本用法。 在这一篇中,我们来看看postgresql除了聚合函数之外还支持哪些窗口函数吧。 row_number() 返回分组后的行号。注意到虽...

    546669204 评论0 收藏0
  • Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition b

    摘要:案例案例在文章列表中附带上前条评论,在获取文章列表时同时把每个文章的前条评论一同查询出来。这是典型分区查询案例,需要根据表中的字段进行分区,同时根据条件进行排序,把符合条件的前条是数据取出来。查询语句中定义变量以及函数的使用如何构建子查询。 案例 案例:Laravel 在文章列表中附带上前10条评论?,在获取文章列表时同时把每个文章的前10条评论一同查询出来。 这是典型分区查询案例,需...

    littleGrow 评论0 收藏0

发表评论

0条评论

darkbug

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<