本文主要是介绍LeetCode-----571. 给定数字的频率查询中位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目技术:1、获取保留小数的方法:round(xxx,n),对于xxx的值保留n位小数,并且是根据四舍五入保留,(eg:select round(3.1415926,4) ; 得到 值为 3.1416 );(同时round()能够搭配其他的函数使用保留小数,例如本题);
2、sum()聚合函数搭配over()开窗函数使用,(开窗函数并不会改变表的字段结构,只会增加一个新的字段)
用法: sum(C) over (partition by A order by B rows between 开始位置 and 结束位置)
rows between 开始位置 and 结束位置 -------------的位置:
current row :当前行
n preceding : 往前n行数据
n following : 往后n行数据
unbounded :起点
unbounded preceding 表示从该组的起点
unbounded following 表示到该组的终点
3、重要思路:如果 n 为中位数,n(包含本身)前累计的数字个数应大于等于总个数/2 ,
同时n(不包含本身)前累计数字个数应小于等于总个数/2
题目: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
。
解答:
解题思路:如果 n 为中位数,n(包含本身)前累计的数字个数应大于等于总个数/2 ,
同时n(不包含本身)前累计数字个数应小于等于总个数/2
selectround(avg(number),2) median
from (selectnumberfrom (selectnumber,sum (frequency) over(order by number rows between unbounded preceding and 1 preceding) sums_prex,sum (frequency) over(order by number ) sums_curr,sum(frequency) over(order by number rows between unbounded preceding and unbounded following) sums_totalfrom numbers)t1where sums_prex<=(sums_total/2) and sums_curr>=(sums_total/2)) t2;
个人解答,如有错误,请谅解并指出,谢谢,共同进步!!!
这篇关于LeetCode-----571. 给定数字的频率查询中位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!