MySQL查询求中位数最简单的写法
mysql 查询 简单 写法 中位数
2023-06-13 09:14:12 时间
直接上查询语句:
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本身没有提供中位数函数。网上有许多写法,基本是笛卡尔积与窗口函数两类,但都不是很理想。
造数:
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. 使用笛卡尔积
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. 使用窗口函数
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. 使用变量 针对中位数这个需求还是用变量好:只扫一遍表,没有版本限制,写法巨简单,见开头。
三种方法都支持奇数行与偶数行。
相关文章
- 探究MySQL实现分数排名的方法(mysql分数排名)
- MySQL的字符连接函数: 简单而强大(mysql字符连接函数)
- MySQL查询:掌握事务处理技巧(mysql查询事务)
- MySQL实战指南:让你成为数据库精通者(mysql实战教程)
- MySQL双机热备,保证数据安全不间断(mysql双机热备)
- Mycat 与 MySQL的稳定性对比(mycat与mysql)
- 挫败与无奈:Yum安装MySQL失败(yum安装mysql失败)
- MySQL每日查询优化(mysql查询每天)
- MySQL表结构合并:简单有用的操作技巧(mysql表结构合并)
- MySQL实现用户授权的有效方式(mysql对用户授权)
- MySQL优化实战:让性能更上一层楼(mysql优化技巧)
- MySQL远程复制数据库简单实现指南(mysql远程复制数据库)
- MySQL树形结构的递归查询方法.(mysql 树形 递归)
- MySQL中的Sum函数统计数据总和(mysql 中sum函数)
- MySQL中零值的重要性及应用(mysql中 0)
- 如何优化MySQL数据库查询不创建索引问题(mysql不创建索引)
- MySQL数据库SQL语句指南(mysql下sql语句)
- 解决MySQL无法输入中文问题的方法(mysql 不能输中文)
- MySQL 数据库查询非顺序匹配的方法与技巧(mysql不按顺序匹配)