【LeetCode-SQL】571. 给定数字的频率查询中位数
目录
- 一、题目
- 二、解决
- 1、sum() over() + avg()
- 2、join
- 三、参考
一、题目
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 。
二、解决
1、sum() over() + avg()
思路:
筛选条件是 desc_frequency >= total_frequency / 2 and asc_frequency >= total_frequency / 2 , desc_frequency 的一半就是中位数
通过筛选条件查询出来的 num 就是中位数,使用 avg 对其求平均数,因为如果是偶数个的话,查出来的中位数是两个。
代码:
select avg(num) as median from (selectnum,sum(frequency) over() total_frequency,sum(frequency) over(order by num desc) desc_frequency,sum(frequency) over(order by num asc) asc_frequencyfrom numbers
) as temp
where desc_frequency >= total_frequency / 2
and asc_frequency >= total_frequency / 2;
2、join
思路:
if(n1.num >= n2.num, n2.frequency, 0)
,第二个参数使用 n2.frequency
是因为按照 n1.num
进行分组的,再使用 sum()
计算 (n1.num
)比 n2.num
大的 n2.frequency
。
- 当
n1.num = 0
>=n2.num = 0
,只会计算 num=0 的n2.frequency
; - 当
n1.num = 1
,符合条件的有n2.num = 0, n2.num = 1
,就会计算 0 和 1 的n2.frequency
。
if(n1.num >= n2.num, n2.frequency, 0)
也是同样流程。
代码:
select avg(num) as median
from
(select n1.num from numbers n1 join numbers n2 group by n1.numhaving sum(if(n1.num >= n2.num, n2.frequency, 0)) >= sum(n2.frequency) / 2and sum(if(n1.num <= n2.num, n2.frequency, 0)) >= sum(n2.frequency) / 2
) as temp;
三、参考
1、详解给定数字的频率查询中位数(三种方法)
2、sum over (order by )
【LeetCode-SQL】571. 给定数字的频率查询中位数相关推荐
- LeetCode MySQL 571. 给定数字的频率查询中位数
文章目录 1. 题目 2. 解题 1. 题目 Numbers 表保存数字的值及其频率. +----------+-------------+ | Number | Frequency | +----- ...
- Mysql练习题15-给定数字的频率查询中位数
需求:编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息: FirstName, LastName, City, State 展示效 ...
- LeetCode 2161. 根据给定数字划分数组
文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 pivot . 请你将 nums 重新排列,使得以下条件均成立: 所有小于 pivot 的元素都 ...
- mysql查询id为偶数_MySQL中查询中位数?
导读:计算中位数可能是小学的内容,然而在数据库查询中实现却并不是一件容易的事.我们今天就来看看都有哪些方法可以实现. 注:本文所用MySQL版本无限制,所列题目均来源于LeetCode. LeetCo ...
- mysql查找有小数点的数据_MySQL中查询中位数?
导读:计算中位数可能是小学的内容,然而在数据库查询中实现却并不是一件容易的事.我们今天就来看看都有哪些方法可以实现. 注:本文所用MySQL版本无限制,所列题目均来源于LeetCode. LeetCo ...
- MySQL中查询中位数?
导读 计算中位数可能是小学的内容,然而在数据库查询中实现却并不是一件容易的事.我们今天就来看看都有哪些方法可以实现. 注:本文所用MySQL版本无限制,所列题目均来源于LeetCode. LeetCo ...
- 5186. 区间内查询数字的频率
5186. 区间内查询数字的频率 请你设计一个数据结构,它能求出给定子数组内一个给定值的 频率 . 子数组中一个值的 频率 指的是这个子数组中这个值的出现次数. 请你实现 RangeFreqQuery ...
- LeetCode(SQL)难度-中等
LeetCode(SQL)难度-中等 注:排名知识点(题目1->思路来源于牛客-小数志(公众号)) 连续排名,例如3000,2000,2000,1000排名结果为1-2-3-4,体现同薪不同名, ...
- SQL必知必会1 查询部分 P1-P129
第1课 了解SQL 这一课程介绍SQL究竟是什么,它能做什么事情 1.1 数据库基础 你正在读这本SQL图书,表明你需要以某种方式与数据库打交道.SQL正是用来实现这一任务的语言,因此在学习SQL之前 ...
最新文章
- 二维数组练习--矩阵的加法和乘法
- 同一张表两方各字段相同_SQL高级知识——派生表
- Xamarin.Android 使用 SQLite 出现 Index -1 requested, with a size of 10 异常
- IOS Animation-CAShapeLayer、UIBezierPath与Animation的结合
- 2021暑假每日一题 【week9 完结】
- java 当前时间的前一天_java获取当前日期的前一天和后一天
- 【WebRTC---序篇】(二)Windows平台WebRTC源码编译
- linux下mono的安装与卸载
- 【转】3.4(译)构建Async同步基元,Part 4 AsyncBarrier
- java企业人事管理系统源码_企业人事管理系统完美版源代码 - 源码下载|行业应用软件|企业管理(财务/ERP/EIP等)|源代码 - 源码中国...
- 诗与远方:无题(四十三)- 幼稚肤浅
- 请假系统特例规则详细设计
- 免费下载全球SRTM高程数据(hgt格式)
- python 已知三条边求三角形的角度
- 服务器IP被封的原因
- 阿里云香港服务器配置选择帮助文档(超详细)
- oracle ip on_logon_trigger,透过Trigger监控Logon和Logoff
- JS打开模态窗口showModalDialog
- web(World Wide Web)
- android 群英传笔记,Android 群英传读书笔记1