目录

  • 问题描述
  • 解题思路
  • 代码实现
  • 结束语


本篇博文又是我的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

结束语

看完这篇,还有更多知识点分享给你哦,自己慢慢找哈,就在下面链接。