• Mysql排名问题


    这里有个需求,就是将下列的学生成绩表进行排名

    1.创建学生成绩表

    #####创建新表########
    CREATE TABLE `s_score`  (
      `id` int NOT NULL AUTO_INCREMENT,
      `score` int NOT NULL DEFAULT 0,
      `name` varchar(20) CHARACTER SET utf8mb4 NULL,
      PRIMARY KEY (`id`)
    );

    2.插入数据

    ###插入数据##########
    INSERT INTO `s_score` (`name`, `score`) VALUES
    ('张三', 80),
    ('小明', 90),
    ('小红', 60),
    ('李四', 70),
    ('赵武', 80),
    ('梁晨', 87),
    ('小绿', 69),
    ('威廉', 69),
    ('大卫', 91),
    ('王五', 96),
    ('赵六', 96),
    ('小五', 80),
    ('小龙', 88);

    3.查看情况:

    2.给一个普通排名

    select name,score, @rank:=@rank+1  rank from s_score s,(select @rank:=0) q order by score desc;

    3.给一个并列排名

    ##并列排名###
    SELECT
        NAME,
        score,
        CASE
    WHEN @temp_score = score THEN
        @rank
    WHEN @temp_score := score THEN
        @rank :=@rank + 1
    END as rank
    FROM
        s_score s,
        (
            SELECT
                @rank := 0 ,@temp_score := NULL
        ) as r
    ORDER BY
        score DESC

    4.给一个跳过排名

    ##并排名词跳过###
    SELECT
        NAME,
        score,
        rank
    FROM
        (
            SELECT
                NAME,
                score ,@rank :=
            IF (
                @temp_score = score,
                @rank,
                @rank_incr
            ) `rank` ,@rank_incr := @rank_incr + 1,
            @temp_score := score
        FROM
            s_score s,
            (
                SELECT@rank := 0 ,@temp_rank := NULL ,@rank_incr := 1
            ) q
        ORDER BY
            score DESC
        ) a

    ######################Mysql8.0中增加了窗口函数##############

    窗口函数的基本语法如下:

    select 排序函数/聚合函数 over (<partition by ...> 分区字段 order by 排序字段)

    说明:注意over后面有一个空格

    partiton by是可选的。如果不使用partition by,那么就是将整张表作为一个集合,最后使用排序函数得到的就是每一条记录根据排序列的排序编号。

    排序函数主要有rank()、dense_rank、row_number,他们主要区别

    • rank(): 对同一个字段排序,出现相同时,会并列排名,并且会出现排名间隙。
    • dense_rank() : 对同一个字段排序,出现相同时,会出现并列排名,排名连续的
    • row_number(): 对同一个字段排序,排名是联系的,即使出现相同,不会并列排名次

    操作:

    SELECT
        NAME,
        score,
        RANK () over (ORDER BY score DESC) `rank`,
        ROW_NUMBER () over (ORDER BY score DESC) `row`,
        DENSE_RANK () over (ORDER BY score DESC) `dense`
    FROM
        s_score

    转载于:https://cloud.tencent.com/developer/article/1562954

        https://segmentfault.com/a/1190000023334323

  • 相关阅读:
    驱动Makefile
    ioremap
    file结构体
    Python基础-语法知识
    企业运营对 DevOps 的「傲慢与偏见」
    漂亮得不像实力派!
    如何用 OneAPM 优化你的 Node.js 应用?
    全球说:要给 OneAlert 点100个赞
    DevOps 和技术债务偿还自动化
    PHP 性能分析与实验(二)——PHP 性能的微观分析
  • 原文地址:https://www.cnblogs.com/zmc60/p/14500632.html
Copyright © 2020-2023  润新知