题目链接:点击打开链接
题目大意:略。
解题思路:
- 解决方案(1):如果 n1.Number 为中位数,n1.Number(包含本身)前累计的数字应大于等于总数/2;同时n1.Number(不包含本身)前累计数字应小于等于总数/2,至于为什么代码里第二个 SUM 里要减去"-AVG(n1.Frequency)",是因为这样就能算出单个 n1.Frequency 值,因为在分组里所有 n1.Frequency 都一样,一平均就是单个自己的 n1.Frequency,只要找到这个规律就KO了。
 - 解决方案(2):使用 sum over(order by) 对数字个数进行正序和逆序累计,当某一数字的 正序和逆序累计 均大于 整个序列的数字个数的一半 时即为中位数,将最后选定的一个或两个中位数进行求均值即可。

 
AC 代码
-- 解决方案(1)
SELECT AVG(Number) median 
FROM
(SELECT n1.Number FROM Numbers n1 JOIN Numbers n2 ON n1.Number>=n2.Number 
 GROUP BY 
 n1.Number 
 HAVING 
 SUM(n2.Frequency)>=(SELECT SUM(Frequency) FROM Numbers)/2 
 AND 
 SUM(n2.Frequency)-AVG(n1.Frequency)<=(SELECT SUM(Frequency) FROM Numbers)/2
) rs;
-- 解决方案(2)
select avg(number) 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









