使用sql的having求中位数

一、建表

create table `department` (
	`id` int (10),
	`name` varchar (150),
	`member` int (10)
); 

二、 初始化数据

insert into `department` (`id`, `name`, `member`) values('1','梦工厂','20');
insert into `department` (`id`, `name`, `member`) values('2','螺丝厂','20');
insert into `department` (`id`, `name`, `member`) values('3','梦工厂','50');
insert into `department` (`id`, `name`, `member`) values('4','梦工厂','30');


三、 求中位数

![此图为类比](https://img-blog.csdnimg.cn/a3025d1d2019478ba1edfcfd808d3c1a.png

1、最里层查询

select t1.member
from demo.`department` t1, demo.`department` t2 
group by t1.member
having 
-- S1的条件
sum(case when t1.member <= t2.member then 1 else 0 end) >= count(*)/2
and 
-- S2的条件
sum(case when t1.member >= t2.member then 1 else 0 end) >= count(*)/2

理解上方查询需要知道几点:
1、关键字执行顺序:groupby先分组,再通过having按组筛选
2、having后的聚合函数sum()使用了自连接查询,所以会从自连接的笛卡尔积中选出符合的组,
3、要求sum结果>=count(*)/2,便是指定s1和s2内的元素数至少为一半取上(等号的作用),进而得到上图的s1、s2,最后and取交集

2、外层查询

里层查询出的交集后,可能不止一个数,所以在外层取平均值即可

3、总实现

SELECT AVG(DISTINCT member)
FROM
(
SELECT t1.member
FROM demo.`department` t1, demo.`department` t2
GROUP BY t1.member
HAVING SUM(CASE WHEN t1.member <= t2.member THEN 1 ELSE 0 END) >= COUNT(*)/2
AND SUM(CASE WHEN t1.member >= t2.member THEN 1 ELSE 0 END) >= COUNT(*)/2
) tmp;

在这里插入图片描述
本文所著为个人理解,若有不妥,请指正,勿喷。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值