前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL查询求中位数最简单的写法

MySQL查询求中位数最简单的写法

作者头像
用户1148526
发布2022-10-28 16:36:05
1.4K0
发布2022-10-28 16:36:05
举报
文章被收录于专栏:Hadoop数据仓库

        直接上查询语句:

代码语言:javascript
复制
select avg(a) from (select a,@a:=@a+1 b from t1,(select @a:=0) t2 order by a) t 
 where b between @a/2 and @a/2+1;

        讨论:MySQL本身没有提供中位数函数。网上有许多写法,基本是笛卡尔积与窗口函数两类,但都不是很理想。

        造数:

代码语言:javascript
复制
create table t1 (id int primary key, a int);
insert into t1 values (1,10),(2,10),(3,20),(4,21),(5,30),(6,30),(7,30),(8,100);

1. 使用笛卡尔积

代码语言:javascript
复制
select avg(distinct a)
from (select t1.a from t1,t1 t2 group by t1.a
      having sum(case when t2.a >= t1.a then 1 else 0 end) >= count(*) / 2.0
         and sum(case when t2.a <= t1.a then 1 else 0 end) >= count(*) / 2.0) tmp;

        笛卡尔积连接扫描行数指数增长,性能很差。

2. 使用窗口函数

代码语言:javascript
复制
select sum(score) / count(*) as midean
from (
         select a score,
                row_number() over (order by a desc,id desc) as desc_math,
                row_number() over (order by a asc, id asc)   as asc_math
         from t1
     ) as order_table
where asc_math in (desc_math, desc_math + 1, desc_math - 1);
  • 优点:只扫一遍表,性能较好
  • 限制:需要MySQL 8以上版本以支持窗口函数;row_number()中的order by值必须唯一,否则遇到重复值情况结果不对。

3. 使用变量         针对中位数这个需求还是用变量好:只扫一遍表,没有版本限制,写法巨简单,见开头。

        三种方法都支持奇数行与偶数行。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档