文档章节

sql语句 成绩排名

LYQ1990
 LYQ1990
发布于 2017/08/17 15:10
字数 974
阅读 117
收藏 0

精选30+云产品,助力企业轻松上云!>>>

sql语句 成绩排名

 

http://www.cnblogs.com/zengguowang/p/5541431.html

-------------------------------------------

思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序;

   mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序asc,设置好排序的变量(初始值为0):

   a>.将已经排序好的数据从第一条依次取出来,取一条就自增加一,实现从1到最后的一个排名

   b>.当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加1

   c.当出现相同的数据时,排名保持不变,但是保持不变的排名依旧会占用一个位置,也就是类似于(1,2,2,2,5)这种排名就是属于中间的三个排名是一样的,但是第五个排名按照上面一种情况是(1,2,2,2,3),现在则是排名相同也会占据排名的位置

准备数据(用户id,分数):

CREATE TABLE `sql_rank` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`score` tinyint(3) unsigned NOT NULL,
`add_time` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

插入数据:

INSERT INTO sql_rank (user_id, score, add_time)
VALUES
(100, 50, '2016-05-01'),
(101, 30, '2016-05-01'),
(102, 20, '2016-05-01'),
(103, 60, '2016-05-01'),
(104, 80, '2016-05-01'),
(105, 50, '2016-05-01'),
(106, 70, '2016-05-01'),
(107, 85, '2016-05-01'),
(108, 60, '2016-05-01')

 

当前数据库数据:

 

一、sql1{不管数据相同与否,排名依次排序(1,2,3,4,5,6,7.....)}

 

SELECT

    obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum

FROM

    (

        SELECT

            user_id,

            score

        FROM

            `sql_rank`

        ORDER BY

            score DESC

    ) AS obj,

    (SELECT @rownum := 0) r

 

执行的结果如下图:

  

可以看到,现在按照分数从1到9都排好序了,但是有些分数相同的用户排名却不一样,这就是接下来要说的第二种sql

二、sql2{只要数据有相同的排名就一样,排名依次排序(1,2,2,3,3,4,5.....)}

 

SELECT

    obj.user_id,

    obj.score,

    CASE

WHEN @rowtotal = obj.score THEN

    @rownum

WHEN @rowtotal := obj.score THEN

    @rownum :=@rownum + 1

WHEN @rowtotal = 0 THEN

    @rownum :=@rownum + 1

END AS rownum

FROM

    (

        SELECT

            user_id,

            score

        FROM

            `sql_rank`

        ORDER BY

            score DESC

    ) AS obj,

    (SELECT @rownum := 0 ,@rowtotal := NULL) r

 

这时候就新增加了一个变量,用于记录上一条数据的分数了,只要当前数据分数跟上一条数据的分数比较,相同分数的排名就不变,不相同分数的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较

如下图结果:

  

跟第一条sql的结果相对比你会发现,分数相同的排名也相同,并且最后一名的名次由第9名变成了第7名;

如果你需要分数相同的排名也相同,但是后面的排名不能受到分数相同排名相同而不占位的影响,也就是哪怕你排名相同,你也占了这个位置(比如:1,2,2,4,5,5,7....这种形式的,虽然排名有相同,但是你占位了,后续的排名根据占位来排)

 

三、sql2{只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序(1,2,2,4,5,5,7.....)}  

   此时需呀再增加一个变量,来记录排序的号码(自增)

 

SELECT

    obj_new.user_id,

    obj_new.score,

    obj_new.rownum

FROM

    (

        SELECT

            obj.user_id,

            obj.score,

            @rownum := @rownum + 1 AS num_tmp,

            @incrnum := CASE

        WHEN @rowtotal = obj.score THEN

            @incrnum

        WHEN @rowtotal := obj.score THEN

            @rownum

        END AS rownum

        FROM

            (

                SELECT

                    user_id,

                    score

                FROM

                    `sql_rank`

                ORDER BY

                    score DESC

            ) AS obj,

            (

                SELECT

                    @rownum := 0 ,@rowtotal := NULL ,@incrnum := 0

            ) r

    ) AS obj_new

 

上面sql执行的结果如下:

  

  结果集中分数相同的,排名相同,同时它也占据了那个位置,中间的一个数据过程本人截图了,请往下看(跟上图做对比你就明白了):

  

 

LYQ1990
粉丝 9
博文 238
码字总数 206220
作品 0
东城
私信 提问
加载中
请先登录后再评论。
sqlserver中分区函数 partition by的用法

需求场景: 表结构及数据: 查询效果: 思路: sql语句: 查询结果: =========================感谢下面这些博主的博客============================= 转自:http://www.cnblogs.com/zhangchengye/...

osc_ufb3fh6o
2018/07/11
2
0
分组函数 partition by 的详解,与order by 区别

partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by用于给结果集分...

osc_qgitz6q2
2019/09/24
1
0
sqlserver中分区函数 partition by的用法

partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by用于给结果集分...

osc_xbbkgf7t
2019/04/18
6
0
PARTITION BY

partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by用于给结果集分...

osc_7cexpmnb
2019/04/01
2
0
SQL语句经典练习30题:基于Navicat for SQLite本地实现

本文介绍利用Navicat for SQLite,省去在本地安装数据库的繁琐环节,轻松在本地实现SQL语句的练习。本文列出的30道题目,基本涵盖全部的sql查询语句,更经典,更实用。 第一部分:环境搭建 ...

AiFan
2018/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

FusionConputer热迁移过程记录

一、迁移原因   云平台集群内存资源不足,已超过设定阈值,内存资源已紧急告警。 二、解决思路   启用新集群,并将老集群中部分虚拟机热迁移至新集群 三、迁移的前提条件   1.被迁移虚...

osc_flwkfqx5
26分钟前
13
0
使用 ServerLess 实现云原生

笔者有幸经历了 IaaS(OS)、CaaS(Container),在这两年又听到了 FaaS(Funtion),这也是运维开发领域里的第三个阶段了吧,今天我将从一个不懂得开发的系统工程师视角以及结合之前的几篇系...

osc_t59f3rc0
27分钟前
18
0
作为软件测试的前辈你能不能给迷茫中的我一点建议?

一、为什么迷茫? 假如前面迷雾一片,作为司机的你,敢踩油门往前冲吗? 大多数人是不敢的。 因为你看不清自己的位置和发展的方向。 同理,一切对未来的恐慌、畏惧、纠结、迷茫,也是因为你看...

osc_auwur47t
29分钟前
12
0
神经机器翻译的直观解释

作者|Renu Khandelwal 编译|VK 来源|Towards Data Science 什么是神经机器翻译? 神经机器翻译是一种将一种语言翻译成另一种语言的技术。一个例子是把英语转换成印地语。让我们想想,如果你在...

osc_u61lmlkv
30分钟前
0
0
用Tableau实现动画数据可视化

作者|PRANAV DAR 编译|VK 来源|Analytics Vidhya 概述 动画可视化是一种艺术,它很容易在Tableau中创造出来 我们将在这里使用开源数据集,并在Tableau中创建自己的动画可视化 介绍 我是动画视...

osc_1oqjcug0
31分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部