数据准备
Create table If Not Exists Numbers (num int, frequency int);
Truncate table Numbers;
insert into Numbers (num, frequency) values ('0', '7');
insert into Numbers (num, frequency) values ('1', '1');
insert into Numbers (num, frequency) values ('2', '3');
insert into Numbers (num, frequency) values ('3', '1');
需求
编写一个 SQL 查询,解压 Numbers 表,报告数据库中所有数字的 中位数 。结果四舍五入至 一位小数 。
输入
分析
- 为number表增加三列,分别对frequency列
求出初始行到当前行的和rn1,逆序求初始行到当前行的和rn2,总和rn3 - 筛选出rn1>=rn3/2 和 rn2>=rn3/2的数据,他们的交集即为所求
- 再使用sum函数求和,使用count(1)求出数据条数,二者相除,并使用round四舍五入,求出结果
输出
-- 为number表增加三列,分别对frequency列
-- 求出初始行到当前行的和rn1,逆序求初始行到当前行的和rn2,总和rn3
-- 筛选出rn1>=rn3/2 和 rn2>=rn3/2的数据,他们的交集即为所求
-- 再使用sum函数求和,使用count(1)求出数据条数,二者相除,并使用round四舍五入,求出结果
with t1 as (
select *,
sum(frequency) over (order by num) rn1,
sum(frequency) over (order by num desc ) rn2,
sum(frequency) over () rn3
from Numbers
)
select round(sum(num)/count(1),1) as median
from t1
where rn1>=rn3/2 and rn2>=rn3/2;