我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中分类排名和分组TOP N的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中分类排名和分组TOP N的示例分析

这篇文章主要介绍MySQL中分类排名和分组TOP N的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

    表结构

    学生表如下:

    CREATE TABLE `t_student` (  `id` int NOT NULL AUTO_INCREMENT,  `t_id` int DEFAULT NULL COMMENT '学科id',  `score` int DEFAULT NULL COMMENT '分数',  PRIMARY KEY (`id`));

    数据如下: 

    MySQL中分类排名和分组TOP N的示例分析

    题目一:获取每个科目下前五成绩排名(允许并列)

    允许并列情况可能存在如4、5名成绩并列情况,会导致取前4名得出5条数据,取前5名也是5条数据。

    SELECTs1.* FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score < s2.score GROUP BYs1.idHAVINGCOUNT( s2.id ) < 5 ORDER BYs1.t_id,s1.score DESC

    MySQL中分类排名和分组TOP N的示例分析

      ps:取前4名时

    MySQL中分类排名和分组TOP N的示例分析

     分析:

    自身左外连接,得到所有的左边值小于右边值的集合。以t_id=1时举例,24有5个成绩大于他的(74、64、54、44、34),是第6名,34只有4个成绩大于他的,是第5名......74没有大于他的,是第一名。

    SELECT* FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score < s2.score

    MySQL中分类排名和分组TOP N的示例分析

      2. 把总结的规律转换成SQL表示出来,就是group by 每个student 的 id(s1.id),Having统计这个id下面有多少个比他大的值(s2.id)

    SELECTs1.* FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score < s2.score GROUP BYs1.idHAVINGCOUNT( s2.id ) < 5

    MySQL中分类排名和分组TOP N的示例分析

     3. 最后根据 t_id 分类,score 倒序排序即可。

    题目二:获取每个科目下最后两名学生的成绩平均值

    取最后两名成绩

    SELECTs1.* FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score > s2.score GROUP BYs1.id HAVINGCOUNT( s1.id )< 2 ORDER BYs1.t_id,s1.score

    并列存在情况下可能导致筛选出的同一t_id 下结果条数大于2条,但题目要求是取最后两名的平均值,多条平均后还是本身,故不必再对其处理,可以满足题目要求。 

    MySQL中分类排名和分组TOP N的示例分析

     分组求平均值:

    SELECTt_id,AVG(score)FROM(SELECTs1.*FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score > s2.scoreGROUP BYs1.id HAVINGCOUNT( s1.id )< 2 ORDER BYs1.t_id,s1.score ) tt GROUP BYt_id

    结果: 

    MySQL中分类排名和分组TOP N的示例分析

    分析:

     查询出所有t1.score>t2.score 的记录

    SELECTs1.*,s2.*FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score > s2.score

    MySQL中分类排名和分组TOP N的示例分析

    group by s.id 去重,having 计数取2条

     group by t_id 分别取各自学科的然后avg取均值

    题目三:获取每个科目下前五成绩排名(不允许并列)

    SELECT* FROM(SELECTs1.*,@rownum := @rownum + 1 AS num_tmp,@incrnum :=CASEWHEN @rowtotal = s1.score THEN@incrnum WHEN @rowtotal := s1.score THEN@rownum END AS rownum FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score > s2.score,( SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0 ) AS it GROUP BYs1.id ORDER BYs1.t_id,s1.score DESC ) tt GROUP BYt_id,score,rownum HAVINGCOUNT( rownum )< 5

    MySQL中分类排名和分组TOP N的示例分析

     分析:

    引入辅助参数

    SELECTs1.*,@rownum := @rownum + 1 AS num_tmp,@incrnum :=CASEWHEN @rowtotal = s1.score THEN@incrnum WHEN @rowtotal := s1.score THEN@rownum END AS rownum FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score > s2.score,( SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0 ) AS it

    MySQL中分类排名和分组TOP N的示例分析

    去除重复s1.id,分组排序

    SELECTs1.*,@rownum := @rownum + 1 AS num_tmp,@incrnum :=CASEWHEN @rowtotal = s1.score THEN@incrnum WHEN @rowtotal := s1.score THEN@rownum END AS rownum FROMstudent s1LEFT JOIN student s2 ON s1.t_id = s2.t_id AND s1.score > s2.score,( SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0 ) AS it GROUP BYs1.id ORDER BYs1.t_id,s1.score DESC

    MySQL中分类排名和分组TOP N的示例分析

     3.GROUP BY    t_id, score, rownum   然后 HAVING 取前5条不重复的

    以上是“MySQL中分类排名和分组TOP N的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    MySQL中分类排名和分组TOP N的示例分析

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    MySQL中分类排名和分组TOP N的示例分析

    这篇文章主要介绍MySQL中分类排名和分组TOP N的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!表结构学生表如下:CREATE TABLE `t_student` ( `id` int NOT NULL
    2023-06-26

    javascript中Array.sort()数组排序的示例分析

    这篇文章主要为大家展示了“javascript中Array.sort()数组排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中Array.sort()数组排序的示
    2023-06-20

    Java中类和对象的示例分析

    这篇文章主要介绍了Java中类和对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类可以看成是创建Java对象的模板1、类的定义public class Dog {
    2023-06-25

    MySQL中DDL和DML的示例分析

    这篇文章将为大家详细讲解有关MySQL中DDL和DML的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、DDL 可能有看官老爷会问,什么是DDL啊?这里博主简单介绍一下,DDL全名
    2023-06-22

    mysql中水平分割的示例分析

    这篇文章给大家分享的是有关mysql中水平分割的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、说明按记录进分分割,不同的记录可以分开保存,每个子表的列数相同。2、优点表关联基本能够在数据库端全部完成;
    2023-06-15

    web中桶排序的示例分析

    这篇文章主要为大家展示了“web中桶排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中桶排序的示例分析”这篇文章吧。桶排序是将待排序集合中处于同一个值域的元素存入同一个桶中,也
    2023-06-27

    web中堆排序的示例分析

    这篇文章给大家分享的是有关web中堆排序的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种**选择排序,**它的最坏,最好,平均时间复杂度均为O(
    2023-06-27

    编程热搜

    目录