题目链接:点击打开链接
题目大意:略。
解题思路:
- 解决方案(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) SELECTAVG(Number) medianFROM(SELECTn1.NumberFROMNumbersn1JOINNumbersn2ONn1.Number>=n2.NumberGROUPBYn1.NumberHAVINGSUM(n2.Frequency)>=(SELECTSUM(Frequency) FROMNumbers)/2ANDSUM(n2.Frequency)-AVG(n1.Frequency)<=(SELECTSUM(Frequency) FROMNumbers)/2) rs; --解决方案(2) selectavg(number) medianfrom (selectnumber, sum(frequency) over(orderbynumber) asc_accumu, sum(frequency) over(orderbynumberdesc) desc_accumufromnumbers) t1, (selectsum(frequency) totalfromnumbers) t2whereasc_accumu>=total/2anddesc_accumu>=total/2