day27 给定数字的频率查询中

571. 给定数字的频率查询中位数
在这里插入图片描述
在这里插入图片描述

解析

中位数就是将所有数字按照升序或者降序排列,然后取最中间的数字

  • 数字个数是奇数的话,那么中位数会在这个序列中
  • 数字个数是偶数的话,那么中位数是最中间的两个数的平均值

步骤

  • sum(frequency) over() total_frequency 计算出所有数字的个数,这里使用窗口函数 over() 就不需要再后面使用 group by
    • 计算总数还可以用 select sum(frequency) as total_frequency from numbers
  • sum(frequency) over(order by num desc) desc_frequency 使用窗口函数 over(order by num desc) 按照 num 降序计算出当前数字和之前数字出现的次数
select num, sum(frequency) over(order by num desc) desc_frequency
from numbers;
numdesc_frequency
31
24
15
012
  • sum(frequency) over(order by num asc) asc_frequency 使用窗口函数 over(order by num asc) 按照 num 升序计算出当前数字和之前数字出现的次数
select num, sum(frequency) over(order by num asc) asc_frequency
from numbers;
numasc_frequency
07
18
211
312
  • 将查询出来的 numdesc_frequencyasc_frequencytotal_frequency 作为临时表 temp
  • 查询临时表 temp , 筛选条件是 desc_frequency >= total_frequency / 2 and asc_frequency >= total_frequency / 2desc_frequency 的一半就是中位数
    通过筛选条件查询出来的 num 就是中位数,使用 avg 对其求平均数,因为如果是偶数个的话,查出来的中位数是两个。
select round(avg(num),1) as median from (
	select
		num,
		sum(frequency) over(order by num desc) desc_frequency,
		sum(frequency) over(order by num asc) asc_frequency,
		sum(frequency) over() total_frequency
	from numbers
) as temp
where desc_frequency >= total_frequency / 2
and asc_frequency >= total_frequency / 2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值