目录
- 问题描述
- 解题思路
- 代码实现
- 结束语
本篇博文又是我的SQL题分享环节,为了记录一下自己的做题过程,以及防止后续力扣会员过期无法再次查看题目,所以我每天都会给大家选出一道质量较高的SQL题目发表到博客上,并且会加上自己的一些解题技巧或实用知识点,希望对大家也能有所帮助。
那么今天给大家分享的题是LeetCode的第571题——给定数字的频率查询中位数。
下面是问题的详细描述。
问题描述
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 。解题思路
这道题其实之前我在之前刷力扣的时候就做过了,印象还是蛮深的。
核心思想:新增两列,将从后往前和从前往后的频数相加,两个数都需要大于等于总数一半,再取平均即可。
代码实现
select avg(num) as 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
) as tmp
where s1 >= s3/2 and s2 >= s3/2结束语
看完这篇,还有更多知识点分享给你哦,自己慢慢找哈,就在下面链接。
















