广告位联系
返回顶部
分享到

mysql排名的三种常见方式总结

Mysql 来源:互联网 作者:佚名 发布时间:2024-05-04 22:47:26 人浏览
摘要

三种常见的排名 row_number、dense_rank、rank在MySQL 5.7中的实现 准备数据 表结构说明 成绩表 SC(SId,CId,score) SId 学?编号 CId 课程编号 score 分数 创建SC表 1 2 3 4 5 create table SC( SId varchar(10), CId varchar(1

三种常见的排名

row_number、dense_rank、rank在MySQL 5.7中的实现

准备数据

表结构说明

成绩表 SC(SId,CId,score)

  • SId 学?编号
  • CId 课程编号
  • score 分数

创建SC表

1

2

3

4

5

create table SC(

    SId varchar(10),

    CId varchar(10),

    score decimal(18,1)

);

插入数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

-- 成绩表 SC

insert into SC values('01' , '01' , 80);

insert into SC values('01' , '02' , 90);

insert into SC values('01' , '03' , 99);

insert into SC values('02' , '01' , 70);

insert into SC values('02' , '02' , 60);

insert into SC values('02' , '03' , 80);

insert into SC values('03' , '01' , 80);

insert into SC values('03' , '02' , 80);

insert into SC values('03' , '03' , 80);

insert into SC values('04' , '01' , 50);

insert into SC values('04' , '02' , 30);

insert into SC values('04' , '03' , 20);

insert into SC values('05' , '01' , 76);

insert into SC values('05' , '02' , 87);

insert into SC values('06' , '01' , 31);

insert into SC values('06' , '03' , 34);

insert into SC values('07' , '02' , 89);

insert into SC values('07' , '03' , 98);

对SC中的学生score进行整体排名

ROW_NUMBER

1 2 3 4 5 6 7 没有重复排名,依次递增

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

SET @i := 0;

SET @p := 0;

SET @q := 0;

SELECT  t1.SId

        ,t1.CId

        ,t1.score

        ,@p := t1.score

        ,if(@p=@q,@i,@i := @i+1) as dense_rank

        ,@q :=@p

from (

    SELECT  SId

            ,CId

            ,score

    from SC

    order by score desc

) t1;

DENSE_RANK

1 2 3 3 3 4 5 6 7 有重复时并列排名,最终排名也是连续的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

SET @i := 0;

SET @p := 0;

SET @q := 0;

SELECT  t1.SId

        ,t1.CId

        ,t1.score

        ,@p := t1.score

        ,if(@p=@q,@i,@i := @i+1) as dense_rank

        ,@q :=@p

from (

    SELECT  SId

            ,CId

            ,score

    from SC

    order by score desc

) t1;

RANK

1 2 3 3 3 6 7 8 有重复时并列排名,最终排名不连续

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

SET @i := 0;

SET @j := 0;

SET @p := 0;

SET @q := 0;

SELECT  t1.SId

        ,t1.CId

        ,t1.score

        ,@j := @j + 1

        ,@p := t1.score

        ,if(@p=@q,@i,@i := @j) as rank

        ,@q :=@p

from (

    SELECT  SId

            ,CId

            ,score

    from SC

    order by score desc

) t1;

进行分组排名

ROW_NUMBER

查询每?课程成绩最好的前三名 1 2 3 4 5 6 7 没有重复排名,依次递增

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

SET @i := 0;

SET @p := 0;

SET @q := 0;

SELECT  tt1.SId

        ,tt2.SName

        ,tt1.CId

        ,tt1.score

        ,tt1.rn

from (

    select  t1.SId

            ,t1.CId

            ,t1.score

            ,@p := t1.CId

            ,if(@p=@q,@i := @i + 1,@i :=1) as rn

            ,@q := @p

    from (

        select  SId

                ,CId

                ,score

        from SC

        order by CId,score DESC

    ) t1

) tt1 join Student tt2 on tt1.rn<=3 and tt1.SId = tt2.SId

order by tt1.CId,tt1.rn;

DENSE_RANK

查询每?课程成绩最好的前三名 1 2 3 3 3 4 5 6 7 有重复时并列排名,最终排名也是连续的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

SET @i := 0;

SET @p := 0;

SET @q := 0;

SET @j := 0;

SET @k := 0;

SELECT  tt1.SId

        ,tt2.SName

        ,tt1.CId

        ,tt1.score

        ,tt1.rn

from (

    select  t1.SId

            ,t1.CId

            ,t1.score

            ,@p := t1.CId

            ,@j := t1.score

            ,if(@p=@q,if(@j=@k,@i,@i := @i + 1),@i :=1) as rn

            ,@q := @p

            ,@k := @j

    from (

        select  SId

                ,CId

                ,score

        from SC

        order by CId,score DESC

    ) t1

) tt1 join Student tt2 on tt1.rn<=3 and tt1.SId = tt2.SId

order by tt1.CId,tt1.rn;

RANK

查询每?课程成绩最好的前三名 1 2 3 3 3 6 7 8 有重复时并列排名,最终排名不连续

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

SET @i := 0;

SET @p := 0;

SET @q := 0;

SET @j := 0;

SET @k := 0;

SET @m := 1;

SELECT  tt1.SId

        ,tt2.SName

        ,tt1.CId

        ,tt1.score

        ,tt1.rn

from (

    select  t1.SId

            ,t1.CId

            ,t1.score

            ,@p := t1.CId

            ,@j := t1.score

            ,if(@p=@q,@m := @m + 1,@m := 1)

            ,if(@p=@q,if(@j=@k,@i,@i := @m),@i :=1) as rn

            ,@q := @p

            ,@k := @j

    from (

        select  SId

                ,CId

                ,score

        from SC

        order by CId,score DESC

    ) t1

) tt1 join Student tt2 on tt1.rn<=3 and tt1.SId = tt2.SId

order by tt1.CId,tt1.rn;


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • mysql日期函数用法大全
    一、 返回当前日期 1、CURRENT_DATE()、CURRENT_DATE和CURDATE()用法相同:返回当前日期 2、CURRENT_TIME()、CURRENT_TIME和CURTIME()用法相同:返回当前时间
  • mysql排名的三种常见方式总结
    三种常见的排名 row_number、dense_rank、rank在MySQL 5.7中的实现 准备数据 表结构说明 成绩表 SC(SId,CId,score) SId 学?编号 CId 课程编号 score 分数 创建
  • MySQL导出ER图为图片或PDF的操作方法

    MySQL导出ER图为图片或PDF的操作方法
    1、Navicat 生成ER图 1、选择数据库,逆向数据库到模型 2、查看ER图 3、导出ER图 当我们选pdf格式的时候,发现导出的pdf不是一整张,而是分成
  • MySQL之union联合查询的实现介绍

    MySQL之union联合查询的实现介绍
    UNION 的含义是联合,并集,结合,在MySQL中可以将多个查询语句的结果合并成一个结果集,在MySQL 不支持FULL OUTER JOIN 的情况下,弥补了并集
  • mysql8.0.29卸载问题小结介绍

    mysql8.0.29卸载问题小结介绍
    提要(废话): 最近我将笔记本重装了,为了保留之前的程序,我把相关的注册表和环境备份了下来,重装之后重新导入成功再现了部分软
  • Navicat连接远程服务器里docker中mysql的方法(已解决

    Navicat连接远程服务器里docker中mysql的方法(已解决
    1. 开启端口映射 在docker中,我们需要将允许外界访问的端口通过配置文件映射出来,本文不需要将3306端口映射,但是该部分还是有实际用途
  • Mysql CASE IF 判空的具体使用介绍
    MySQL 中的条件表达式用于根据条件的结果选择不同的值或执行不同的操作。条件表达式可以在 SELECT 语句中生成计算字段、在 WHERE 语句中过
  • MySQL中匹配年月的教程方法
    一般数据库中给到的时间都是年-月-日形式的,那怎么匹配年-月/的形式? 如2021年8月怎么写(怎么在数据库中查询到关于2021年8月的数据)
  • mysql5.7.42到mysql8.2.0的升级(rpm方式)

    mysql5.7.42到mysql8.2.0的升级(rpm方式)
    注:本文在测试环境升级测试,建议先在测试环境验证。mysql-5.7.42为rpm安装,所以用rpm方式升级 1、升级准备 1、数据备份:在升级之前,务
  • mysql-5.7.42升级到mysql-8.2.0(二进制方式)

    mysql-5.7.42升级到mysql-8.2.0(二进制方式)
    8注:本文在测试环境升级测试,建议先在测试环境验证。在生产环境下还是先评估下,mysql-5.7.42为二进制方式安装,所以用mysql-8.2.0二进制
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计