SQL突击战——给定数字的频率查询中位数
571. 给定数字的频率查询中位数
#SQL架构
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')
Numbers 表:
+-------------+------+
| Column Name | Type |
+-------------+------+
| num | int |
| frequency | int |
+-------------+------+
num 是这张表的主键。这张表的每一行表示某个数字在该数据库中的出现频率。
中位数 是将数据样本中半数较高值和半数较低值分隔开的值。
编写一个 SQL 查询,解压 Numbers 表,报告数据库中所有数字的 中位数 。结果四舍五入至 一位小数 。
查询结果如下例所示。
示例:
输入:
Numbers 表:
+-----+-----------+
| num | frequency |
+-----+-----------+
| 0 | 7 |
| 1 | 1 |
| 2 | 3 |
| 3 | 1 |
+-----+-----------+
输出:
+--------+
| median |
+--------+
| 0.0 |
+--------+
解释:
如果解压这个 Numbers 表,可以得到 [0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3] ,所以中位数是 (0 + 0) / 2 = 0 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-median-given-frequency-of-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
中位数的选择有两种情况,一是中间两个不同数的均值,二是中间两个相同的数或者中间一个数(可以看做一种情况,都是这个数本身)。对于例一来说是0和1的均值,观察发现他们 的降序累加和 与增序累加和均大于总数的二分之一;对于例二也满足该条件,因此只需要取出降序累加和 与增序累加和均大于总数的二分之一的数据项求均值即可。
# Write your MySQL query statement below
select round(avg(tmp.num),1) median from
(
select num, Frequency,
sum(Frequency) over (order by num desc) s1,
sum(Frequency) over (order by num asc) s2,
sum(Frequency) over () s3
from Numbers
) tmp where tmp.s2>=s3/2 and tmp.s1>=s3/2
语法笔记
sum() over ()实现累加和
sum(Frequency) over (order by num desc) s1表示按照num进行排序,对Frequency进行累加如:
1 2 3 4 5
累加和结果为 1 3 6 10 15
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
Hao.Jia's Blog!
喜欢就支持一下吧