zmc60

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

分类:

技术点:

相关文章:

  • 2022-02-10
  • 2022-12-23
  • 2021-09-19
  • 2021-12-02
  • 2021-11-14
  • 2021-12-26
  • 2021-07-10
  • 2021-10-08
猜你喜欢
  • 2021-12-09
  • 2021-08-11
  • 2021-06-20
  • 2021-09-05
  • 2021-09-15
  • 2021-06-14
  • 2022-12-23
相关资源
相似解决方案