571. 给定数字的频率查询中位数

it2024-02-22  59

Numbers 表保存数字的值及其频率。

+----------+-------------+ | Number | Frequency | +----------+-------------| | 0 | 7 | | 1 | 1 | | 2 | 3 | | 3 | 1 | +----------+-------------+

在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。

+--------+ | median | +--------| | 0.0000 | +--------+

请编写一个查询来查找所有数字的中位数并将结果命名为 median 。

题目条件

# MySQL DROP TABLE IF EXISTS `numbers`; CREATE TABLE `numbers` ( `Number` int(11) DEFAULT NULL, `Frequency` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; /*Data for the table `numbers` */ insert into `numbers`(`Number`,`Frequency`) values (0,7),(1,1),(2,3),(3,1);

使用sum() over()计算frequency正序和倒序的累计值

算法

新增两列,将从后往前和从前往后的频数相加,两个数都需要大于等于总数一半,再取平均。

# MySQL SELECT ROUND(AVG(number),1) median FROM( SELECT number, SUM(frequency) over(ORDER BY number) asc_accumu, SUM(frequency) over(ORDER BY number DESC) desc_accumu FROM numbers ) t1, ( SELECT SUM(frequency) total FROM numbers ) t2 WHERE asc_accumu >= total/2 AND desc_accumu >=total/2;

结果

来源:力扣(LeetCode)

上一题:569. 员工薪水中位数

最新回复(0)