返回顶部
首页 > 资讯 > 数据库 >MySQL中分类排名和分组TOP N的示例分析
  • 576
分享到

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

2023-06-26 05:06:46 576人浏览 薄情痞子
摘要

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

这篇文章主要介绍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的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

    您可能感兴趣的文档:

    --结束END--

    本文标题: MySQL中分类排名和分组TOP N的示例分析

    本文链接: https://lsjlt.com/news/306897.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • MySQL中分类排名和分组TOP N的示例分析
      这篇文章主要介绍MySQL中分类排名和分组TOP N的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!表结构学生表如下:CREATE TABLE `t_student` ...
      99+
      2023-06-26
    • MySQL分类排名和分组TOPN实例详解
      目录表结构题目一:获取每个科目下前五成绩排名(允许并列) 分析:题目二:获取每个科目下最后两名学生的成绩平均值分析:题目三:获取每个科目下前五成绩排名(不允许并列)&nbs...
      99+
      2024-04-02
    • css中分组的示例分析
      小编给大家分享一下css中分组的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 分组提供了一些有意思的选择。例如,下例...
      99+
      2024-04-02
    • MySQL中GROUP BY分组排序获取topN相关的示例分析
      这篇文章主要介绍MySQL中GROUP BY分组排序获取topN相关的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! MySQL VERSION...
      99+
      2024-04-02
    • js中排序与重组的示例分析
      小编给大家分享一下js中排序与重组的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!示例:function in...
      99+
      2024-04-02
    • javascript中Array.sort()数组排序的示例分析
      这篇文章主要为大家展示了“javascript中Array.sort()数组排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中Array.sort()数组排序的示...
      99+
      2023-06-20
    • Mysql教程分组排名实现示例详解
      目录1.数据源2.数据整体排名1)普通排名2)并列排名3)并列排名3.数据分组后组内排名1)分组普通排名2)分组后并列排名3)分组后并列排名4.分组后取各组的前两名1.数据源 2....
      99+
      2024-04-02
    • vue组件命名和props命名的示例分析
      这篇文章主要为大家展示了“vue组件命名和props命名的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue组件命名和props命名的示例分析”这篇文...
      99+
      2024-04-02
    • ES6中类的示例分析
      小编给大家分享一下ES6中类的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ES5近似结构在ES5中没有类的概念,最相近...
      99+
      2024-04-02
    • MySQL和timeout的示例分析
      这篇文章主要介绍了MySQL和timeout的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。下面总结下和连接有关的timeout s...
      99+
      2024-04-02
    • MySQL 索引分类中单列索引的示例分析
      本篇文章为大家展示了MySQL 索引分类中单列索引的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 一个已分区的表不支持全文本...
      99+
      2024-04-02
    • mysql分表分区的示例分析
      这篇文章给大家介绍mysql分表分区的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。面对当今大数据存储,设想当mysql中一个表的总记录超过1000W,会出现性能的大幅度下降吗...
      99+
      2024-04-02
    • Mysql中varchar和text的示例分析
      小编给大家分享一下Mysql中varchar和text的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Varchar 对...
      99+
      2024-04-02
    • MySQL中DDL和DML的示例分析
      这篇文章将为大家详细讲解有关MySQL中DDL和DML的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、DDL        可能有看官老爷会问,什么是D...
      99+
      2023-06-22
    • Java中类和对象的示例分析
      这篇文章主要介绍了Java中类和对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类可以看成是创建Java对象的模板1、类的定义public class&...
      99+
      2023-06-25
    • JavaScript中数组求和的示例分析
      这篇文章给大家分享的是有关JavaScript中数组求和的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript数组求和的方法:1、利用递归,让数组元素不断相...
      99+
      2024-04-02
    • javascript中数组排序与对象排序的示例分析
      这篇文章将为大家详细讲解有关javascript中数组排序与对象排序的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。javascript  数组排序与对...
      99+
      2024-04-02
    • vue.js过渡css类名的示例分析
      这篇文章主要为大家展示了“vue.js过渡css类名的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue.js过渡css类名的示例分析”这篇文章吧。首...
      99+
      2024-04-02
    • Angular排序的示例分析
      这篇文章主要为大家展示了“Angular排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular排序的示例分析”这篇文章吧。angular的排...
      99+
      2024-04-02
    • Bootstrap排版的示例分析
      小编给大家分享一下Bootstrap排版的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!GitHub上这样介绍 boot...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作