MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

目录

表结构

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

分析:

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

分析:

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

分析:

ROW_NUMBER()函数版

参考资料:

表结构

学生表如下:

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,ROW_NUMBER()函数

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

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

SELECT
    s1.*
FROM
    student s1
    LEFT JOIN student s2 ON s1.t_id = s2.t_id
    AND s1.score < s2.score
GROUP BY
    s1.id
HAVING
    COUNT( s2.id ) < 5
ORDER BY
    s1.t_id,
    s1.score DESC

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

ps:取前4名时

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

分析:

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

SELECT
    *
FROM
    student s1
    LEFT JOIN student s2 ON s1.t_id = s2.t_id
    AND s1.score < s2.score

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数
  1. 把总结的规律转换成SQL表示出来,就是group by 每个student 的 id(s1.id),Having统计这个id下面有多少个比他大的值(s2.id)
SELECT
    s1.*
FROM
    student s1
    LEFT JOIN student s2 ON s1.t_id = s2.t_id
    AND s1.score < s2.score
GROUP BY
    s1.id
HAVING
    COUNT( s2.id ) < 5

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数
  1. 最后根据 t_id 分类,score 倒序排序即可。

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

取最后两名成绩

SELECT
    s1.*
FROM
    student s1
    LEFT JOIN student s2 ON s1.t_id = s2.t_id
    AND s1.score > s2.score
GROUP BY
    s1.id
HAVING
    COUNT( s1.id )< 2
ORDER BY
    s1.t_id,
    s1.score

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

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

分组求平均值:

SELECT
    t_id,AVG(score)
FROM
    (
    SELECT
        s1.*
    FROM
        student s1
        LEFT JOIN student s2 ON s1.t_id = s2.t_id
        AND s1.score > s2.score
    GROUP BY
        s1.id
    HAVING
        COUNT( s1.id )< 2
    ORDER BY
        s1.t_id,
        s1.score
    ) tt
GROUP BY
    t_id

结果:

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

分析:

  1. 查询出所有t1.score>t2.score 的记录
SELECT
        s1.*,s2.*
    FROM
        student s1
        LEFT JOIN student s2 ON s1.t_id = s2.t_id
        AND s1.score > s2.score

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数
  1. group by s.id 去重,having 计数取2条

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

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

SELECT
    *
FROM
    (
    SELECT
        s1.*,
        @rownum := @rownum + 1 AS num_tmp,
        @incrnum :=
    CASE

            WHEN @rowtotal = s1.score THEN
            @incrnum
            WHEN @rowtotal := s1.score THEN
            @rownum
        END AS rownum
    FROM
        student s1
        LEFT 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 BY
        s1.id
    ORDER BY
        s1.t_id,
        s1.score DESC
    ) tt
GROUP BY
    t_id,
    score,
    rownum
HAVING
    COUNT( rownum )< 5

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

分析:

1.引入辅助参数

SELECT
    s1.*,
    @rownum := @rownum + 1 AS num_tmp,
    @incrnum :=
CASE

        WHEN @rowtotal = s1.score THEN
        @incrnum
        WHEN @rowtotal := s1.score THEN
        @rownum
    END AS rownum
FROM
    student s1
    LEFT 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,ROW_NUMBER()函数

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

SELECT
        s1.*,
        @rownum := @rownum + 1 AS num_tmp,
        @incrnum :=
    CASE

            WHEN @rowtotal = s1.score THEN
            @incrnum
            WHEN @rowtotal := s1.score THEN
            @rownum
        END AS rownum
    FROM
        student s1
        LEFT 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 BY
        s1.id
    ORDER BY
        s1.t_id,
        s1.score DESC

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

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

ROW_NUMBER()函数版

必要条件:MySQL版本 8.0+

row_number() OVER ([PARTITION BY COL1] ORDER BY COL2)

表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。

select * from (SELECT
    *,
    ROW_NUMBER() OVER(PARTITION BY t_id ORDER BY score DESC) top
FROM
    student
)t where top<=5< code></=5<>

MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

参考资料:

Mysql – 获取每个分类下面前几条数据

mysql mysql SELECT 自增数显示

mysql 每个分类前十名_一文解决所有MySQL分类排名问题

mysql:名次排名 (并列与不并列)

查询每个班成绩排名前三的学生信息

mysql mysql SELECT 自增数显示

MySQL 实现分组 TopN 问题

Original: https://blog.csdn.net/Dlgdlgd/article/details/122129327
Author: 奔放的程序猿
Title: MySQL 分类排名(并列、不并列),分组TOP N,ROW_NUMBER()函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/663500/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 编辑距离与语音识别中WER的计算

    编辑距离(edit distance) 做语音识别算法工程师好几年,最近才弄清楚wer与插入错误,删除错误和替换错误的统计算法,真是惭愧。 编辑距离,又称Levenshtein D…

    人工智能 2023年5月25日
    094
  • O2O优惠券数据分析(一)

    写在前面的话 本文的数据分析任务是我在几个月前为了准备面试锻炼自己的数据分析思路做的,项目中没有涉及到机器学习建模内容,是一个单纯用数据得出结论的任务。因为准备时间仓促,所以项目里…

    人工智能 2023年6月11日
    084
  • Python处理Excel——筛选并标出符合的描述词

    目录 问题描述 思路 运用到的库 用到的方法 问题描述 大概是这样的一张表格 我们需要找到符合的形容词并标上1,并且这个excel文件里有两个sheet 思路 读取excel文件 …

    人工智能 2023年7月6日
    089
  • 用Opencv在QT下写的第一个图像处理程序

    第一步,下载Opencv 下载后放在目录下,比如放在C盘根目录下,里面有两个文件夹build与sources 第二步,用Qtcreate创建widget工程,这里命名为opencv…

    人工智能 2023年7月20日
    060
  • 超分之EDSR

    这篇文章是SRResnet的升级版——EDSR,其对网络结构进行了优化(去除了BN层),省下来的空间可以用于提升模型的size来增强表现力。此外,作者提出了一种基于EDSR且适用于…

    人工智能 2023年6月23日
    062
  • 长期稳定的项目—steam搬砖

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    人工智能 2023年7月29日
    072
  • 10+个神经网络

    文章目录 Transformer.ViT.DETR SNN YOLOV12345XE SSD RCNN.fastRCNN.fasterRCNN Mask RCNN UNet inc…

    人工智能 2023年7月14日
    096
  • 基于Hadoop的数据分析案例-陌陌聊天软件数据分析

    目录 前言 一、使用的工具 二、操作步骤 1.数据来源 2.数据内容分析 3.加载数据 4.数据清洗ETL 5.数据分析 8.数据可视化 前言 本文章是使用基于Hadoop的数据仓…

    人工智能 2023年7月15日
    072
  • 五分钟了解机器学习的基本概念

    目录 1、人工智能、机器学习、深度学习之间的关系 2、什么是机器学习? 3、机器学习的常见问题之 过拟合 4、如何克服过拟合? 5、机器学习的类型 6、分类和回归 1、人工智能、机…

    人工智能 2023年6月15日
    097
  • 数据挖掘流程梳理

    理解业务与数据 一个好的数据挖掘必须去理解业务,对业务好的理解能够帮助你选择合适的数据、合适的算法去训练,得到更好的结果 数据准备 数据准备是基于原始数据,去构建数据挖掘模型所需的…

    人工智能 2023年7月16日
    091
  • 使用python来完成数据的线性拟合

    拟合,顾名思义就是通过对数据的分析,找到数据之间的数学关系,把这种关系的本质理解的越深,得到的拟合度就越高,越能清晰描述数据间的相互联系。拟合有线性拟合和非线性拟合(多项式拟合)。…

    人工智能 2023年6月15日
    0106
  • 2021 SLAM会议论文汇总

    目录 1.ICRA2021 * 语义定位与建图 视觉SLAM 视觉里程计 视觉三维重建 视觉惯性里程计 跟踪 深度估计 视觉定位 激光雷达定位 多传感器数据融合 多传感器融合建图 …

    人工智能 2023年6月2日
    0109
  • 关于opencv库的安装以及一些常见的问题

    对opencv库的安装以及在使用中遇到的一些问题做一下总结,最大的一个问题就是安装好后,cv2下的自带的函数都显示不出来,也不能用。 安装 首先说一下安装,可以直接在Anacond…

    人工智能 2023年7月19日
    062
  • python实现树莓派监控_树莓派上安装pyaudio 及 对声音实时监控

    在树莓派上最常用的录音是arecord命令,但是功能有限,不能实现检测到声音做出反应。但是pyaudio能。 本文实现的功能是在树莓派上监听声音,当分贝超过阈值,将会做出反应,例子…

    人工智能 2023年5月27日
    0193
  • STM32笔记之 SDRAM

    写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 目录 SDRAM芯片 …

    人工智能 2023年6月29日
    0118
  • 机器学习之聚类(基本知识点整理)

    无监督学习 无监督学习是机器学习的一种方法,没有给定事先标记过的训练示例,自动对输入数据进行分类或分群。无监督学习的优点:①算法不受监督信息(偏见)的约束,可能考虑到新的信息。②不…

    人工智能 2023年5月31日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球