文档章节

sql语句 成绩排名

LYQ1990
 LYQ1990
发布于 2017/08/17 15:10
字数 974
阅读 41
收藏 0
点赞 0
评论 0

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
粉丝 6
博文 214
码字总数 197551
作品 0
东城
一道面试题中涉及到的SQL的高级使用

题目是这样的: 3、现在需要做一个全省的学生成绩资料库,系统功能和信息如下: 需要保存的信息有学生ID,学生姓名,学生成绩,所在学校,所在城市,时间 A、请你按照以上需求设计表结构,包...

cjxcloud
2016/06/05
139
0
SQL SERVER使用WITH TIES获取前几行数据

一、SQL SERVER中使用WITH TIES的用途 1、在排名次时,经常遇到取前10名,但刚好第11名(12、13...)的成绩和第10名的一样,我们必须也把后面成绩相同的也取出来,SQL SERVER中WITH TIES语句...

学习也休闲
2016/04/23
42
0
sql语句中不常用但很有用的小用法(转)

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 1、在编写随机出卷系统时,用到随机抽出题库中的N道题目,方法很多,有人使用随机函数等等,其实,一条...

技术小美
2017/11/12
0
0
零基础如何学习SQL——了解select查询语句

如果看这一篇文章对你来说都有些困难的话,你可以先阅读我之前第一篇完全针对彻底零基础的朋友所写的文章,希望能帮助到你。知乎专栏-浅识SQL学习SQL语句,如果你学会了select查询语句,那么...

朴克
2017/01/01
0
0
总结SQL Server窗口函数的简单使用

一、从一个熟悉的示例说起 我们熟知的数据库分页查询,以这一篇介绍过的为例吧。分页查询Person表中的人,可以这么写SQL语句: 其中,ROW_NUMBER()是排名函数,而紧随其后的 OVER()函数就是窗...

嗯哼9925
2017/11/23
0
0
数据库按字段排序并更新的sql语句

偶然看到的一个需求: 很简单的一个表,大约几十万行,列就一个id(学号),一个score(成绩) 现在要加一列rank(排名),要按照score得到排名并更新到数据库中 怎么想都很麻烦,对这种需要...

chencliff
2013/07/30
1K
7
mysql 成绩排名

假设--》 table 表有 id,name,mark 三个字段 查出学生成绩并按成绩进行排名次 ,sql怎么写呢?(成绩相等的学生并列名次) 求助。。。。

zerohh
2013/03/21
5.1K
12
SQL必知必会读书笔记

半小时学会SQL 本篇文章是 SQL 必知必会 的读书笔记,SQL必知必会的英文名叫做 Sams Teach Yourself in 10 Minutes。但是,我肯定是不能够在10分钟就能学会本书所有涉及到的sql,所以就起个名...

shanyue
2017/10/24
0
0
LeetCode:Rank Scores - 按分数排名次

1、题目名称 Rank Scores(按分数排名次) 2、题目地址 https://leetcode.com/problems/rank-scores/ 3、题目内容 按分数排名次,如果两个Id的分数一样,那么他们的名次是一样的,排名从1开始...

北风其凉
2015/08/16
0
0
微软 Azure 与开源结缘:SQL Server 因此受益

对于微软数据库软件来说,2016 是一个丰收年,因为该公司的 SQL Server 被奥地利咨询公司 Solid IT 评为“年度数据库管理系统”。Solid IT 在今日发表的一篇博客中指出:“尽管甲骨文在排名上...

局长
2017/01/05
3.5K
17

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周一乱弹 —— 如果是你喜欢的女同学找你借钱

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享Michael Learns To Rock的单曲《Fairy Tale》 《Fairy Tale》- Michael Learns To Rock 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
24分钟前
7
3
NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
11
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部