码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • mysql高级刷题-01-求中位数


    题目:
    在这里插入图片描述
    在这里插入图片描述
    解题代码

    select sum(num) / count(num) as median
    from (select num,
                 row_number() over (order by num desc,id desc ) as desc_math,
                 row_number() over (order by num ,id )          as asc_math
          from number) as t1
    where asc_math in (desc_math, desc_math + 1, desc_math - 1)
    

    步骤1:内部子查询
    sql

    SELECT num,
           ROW_NUMBER() OVER (ORDER BY num DESC, id DESC) AS desc_math,
           ROW_NUMBER() OVER (ORDER BY num, id) AS asc_math
    FROM number
    

    这部分查询为每行数据生成两个行号:

    desc_math: 按照 num 列递减排序(如果 num 值相同,则按 id 递减排序)。
    asc_math: 按照 num 列递增排序(如果 num 值相同,则按 id 递增排序)。
    这两个行号帮助我们在后续步骤中确定中位数的位置。

    步骤2:外部查询
    sql

    SELECT SUM(num) / COUNT(num) AS median
    FROM (
        -- 内部子查询...
    ) AS t1
    WHERE asc_math IN (desc_math, desc_math + 1, desc_math - 1);
    

    外部查询根据行号筛选出可能是中位数的行:

    asc_math 是递增排序后的行号
    desc_math 是递减排序后的行号
    WHERE asc_math IN (desc_math, desc_math + 1, desc_math - 1) 条件确保选择的数据行满足以下情况:

    asc_math 等于 desc_math,即中间的那个数(如果总数是奇数)
    asc_math 等于 desc_math + 1 或 desc_math - 1,即中间的两个数之一(如果总数是偶数)
    最终计算
    sql

    SELECT SUM(num) / COUNT(num) AS median
    SUM(num) / COUNT(num) 
    

    计算被选中的 num 值的平均数。对于奇数个数,这只是中间那个数的值;对于偶数个数,这会计算中间两个数的平均值。

    完整的查询流程
    生成行号:

    使用窗口函数 ROW_NUMBER() 分别按照递增和递减顺序为每行数据生成行号。
    筛选中位数候选行:

    使用 WHERE 子句筛选出可能是中位数的行。
    计算中位数:

    计算被选中行的 num 值的平均数。
    示例数据及其应用
    假设 number 表的数据如下:
    在这里插入图片描述

    执行上述查询步骤后:
    生成行号:
    desc_math 行号:7, 6, 5, 4, 3, 2, 1
    asc_math 行号:1, 2, 3, 4, 5, 6, 7
    筛选中位数候选行:
    中位数行:asc_math 为 4, desc_math 也是 4(总数为奇数,直接取中间值)
    计算中位数:
    中位数为 6
    因此,这个查询能够在 MySQL 8.0 中有效地计算数据表中的中位数。

  • 相关阅读:
    Python深度学习 学习笔记2 神经网络的数据表示
    柔性机械系统分布参数建模及其控制的研究与进展
    动态规划法——递进式教你运用代码题解《买卖股票的最好时机》
    检查文件名是否含不可打印字符的C++代码源码
    一致性协议-ChainPaxos详解
    pytorch: Tensor.new_zeros使用场景,type_as函数, torch.stack()使用方法
    软件测试 - Linux的远程连接
    如何将表格内容拆分至多列内容
    如何使用 CSS 为 SVG 制作动画:示例教程
    IROS 2022 | 基于实例编码Transformer的3D零件装配,性能提升10%
  • 原文地址:https://blog.csdn.net/weixin_53191998/article/details/139476336
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号