题目:
Numbers 表保存数字的值及其频率。在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。
请编写一个查询来查找所有数字的中位数并将结果命名为 median 。注意:什么是中位数?当一串数字是奇数个时,例如8,3,5,1,4。我们按顺序排列后为:1,3,4,5,8。那么4就是中位数 当一串数字为偶数个时,例如8,3,5,1,4,2。我们按顺序排列后为:1,2,3,4,5,8。那么(3+4)/2=3.5就是中位数。
参考答案:
数据库版本:Server version: 8.0.20 MySQL Community Server - GPL
建表语句
create table dailytest_20200608(
number int,
frequency int
);
数据准备
insert into dailytest_20200608 values(0,7),(1,1),(2,3),(3,1);
查询逻辑
select
number
from (select A.number,
# 获取相同number对应的起始下标
@r := @r + 1 as start_index,
# 获取相同number对应的结束下标
@r := @r + frequency - 1 as end_index,
# 获取中位数的起始下标
if(cnt mod 2 = 0, cnt div 2, (cnt div 2) + 1) as first_index,
# 获取中位数的结束下标
(cnt div 2) + 1 as second_index
from dailytest_20200608 A,
(select sum(frequency) as cnt from dailytest_20200608) B,
(select @r := 0) C) D
where
# 中位数的起始下标匹配number的起始下标和结束下标
(first_index >= start_index and first_index <= end_index)
or
# 中位数的结束下标匹配number的起始下标和结束下标
(second_index >= start_index and second_index <= end_index);
附:
题目来源:https://mp.weixin.qq.com/s/dAEuoagQn20dues5Fmz9Eg
参考答案:https://www.cnblogs.com/longlongaway/p/12779782.html
https://blog.csdn.net/Hello_JavaScript/article/details/103332960
https://blog.csdn.net/qq_43618030/article/details/104239641
拓展题目:https://www.cnblogs.com/longlongaway/p/12779810.html
https://blog.csdn.net/liuade/article/details/82668681