一文搞懂SQL-计算众数、中位数
众数的概念
众数作为统计学中重要的概念,它指在群体出现次数最多的值,在下面这张表中,众数是10000和20000这两个值。
name | income |
---|---|
辛普森 | 400000 |
迈克 | 30000 |
怀特 | 20000 |
阿诺德 | 20000 |
史密斯 | 20000 |
劳伦斯 | 15000 |
哈德逊 | 15000 |
肯特 | 10000 |
贝克 | 10000 |
贝克特 | 10000 |
利用sql求取众数-方法1
有些DBMS已经提供了用来求取众数的函数,但其实用标准SQL也很简单。思路是将收入相同的汇入一个集合,然后从汇总后的各个集合中,找出元素个数最多的集合。用SQL 这么操作很简单。
SELECT income,Count(*) as cnt
FROM
Graduates
Group by
income
HAVING
count(*) >=ALL(SELECT count(*) from Graduates GROUP BY income);
执行结果:
income | cnt |
---|---|
10000 | 3 |
20000 | 3 |
简要解析
Group by 子句的作用是根据最初的集合生成若干个子集。因此,将收入(income)作为GROUP BY列时,将得到S1~S5这样5个子集。如下图所示:
这里元素最多的就是S3和S5,二者都是三个元素,因此查询结果也是这两个结果。
利用sql求取众数-方法2
当然采用ALL谓词用于NULL或空集时,可能会出现问题,可以用极致函数来代替,这里要求求取元素最多的集合,因此可以采用max函数。
--使用极致函数求取众数
SELECT income,count(*) as cnt
FROM Graduates
group by income
having count(*) >=(select max(cnt) From(select count(*) as cnt
from
Graduates
group by
income
)TMP
)
中位数
与众数一样,在统计学中,中位数一样被经常用到的指标。它指的是将集合中的元素按升序排列后恰好位于正中间的元素。如果集合的元素个数为偶数,则取中间两个元素的平均值作为中位数。前面的表 Graduates 里有 10 行数据,所以我们取“史密斯 , 20 000”和“劳伦斯 , 15 000”的平均值 17 500 作为中位数。
如果用 SQL,该如何求中位数呢?像面向过程语言的处理方法那样排完序逐行比较,显然是不合理的。所以我们来思考一下如何用面向集合的方式,来查询位于集合正中间的元素。SQL的做法是,将集合里的元素按照大小分为上半部分和下半部分两个子集,同时让这 2 个子集共同拥有集合正中间的元素。这样,共同部分的元素的平均值就是中位数,思路如下图所示。
sql实现中位数求取
select avg(distinct income)
from
(select T1.income from graduates T1,Graduates T2 Group by T1.income
--条件1
having
sum(case when T2.income>=T1.income Then 1 else 0 end)>=count(*)/2
--条件2
and
sum(case when T2.income<=T1.income then 1 else 0 end) >=count(*)/2
)
这条 SQL 语句的要点在于比较条>= COUNT(*)/2 里的等号,这个等号是有意地加上的。加上等号并不是为了清晰地分开子集 S1 和S2,而是为了让这 2 个子集拥有共同部分。如果去掉等号,将条件改成“> COUNT(*)/2”,那么当元素个数为偶数时,S1 和 S2 就没有共同的元素了,也就无法求出中位数了。如果事先知道集合的元素个数是奇数,那么因为 FROM 子句里的子查询结果只有一条数据,所以外层的 AVG 函数可以去掉。但是,如果要写出更通用的 SQL 语句(即适用于元素个数为偶数这种情况),AVG 函数还是需要的。这道例题的解法运用了 CASE 表达式、自连接以及 HAVING 子句等 SQL 的各种利器,笔者觉得还是很棒的。
一文搞懂SQL-计算众数、中位数相关推荐
- 一文搞懂faiss计算
Faiss的全称是Facebook AI Similarity Search. 这是一个开源库,针对高维空间中的海量数据,提供了高效且可靠的检索方法. 暴力检索耗时巨大,对于一个要求实时人脸识别的应用 ...
- 一文搞懂 SQL:基础知识和业务实践总结
作者:cooperyjli,腾讯 CDG 数据分析师 SQL的全称是Structured Query Language(结构化查询语言),是一种古老而简洁的程序设计语言.看似平平无奇,一直被各种吐槽, ...
- 从零入门 Serverless | 一文搞懂函数计算及其工作原理
作者 | 孔德慧(夏莞) 阿里云函数计算开发工程师 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门" ...
- 从零入门Serverless|一文搞懂函数计算及其工作原理
云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 什么是函数计算? 大家都了解,Serverless 并不是没有服务器,而是开发者不再需要关心服务器 ...
- 一文搞懂SQL注入攻击
SQL注入攻击 1. 前言 2. SQL注入简介 3. SQL注入步骤 4. 防范SQL注入 1. 前言 随着互联网的发展和普及,网络安全问题越来越突出,网络在为用户提供越来越多服务的同时,也要面对各 ...
- 一文搞懂SQL中的各种联结——内联结、自然联结、自联结、交叉联结
一.概述 所谓" 联结 "指的是数据表和本身,以及不同数据表之间的" 联结关系 ".常见的联结有自连接.自然连接.内连接.外联结.完全连接等等.本文以SQLit ...
- 一文搞懂MySQL数据库分库分表
如果数据量过大,大家一般会分库分表.分库需要注意的内容比较少,但分表需要注意的内容就多了. 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过 ...
- python语言语句快的标记是什么_一文搞懂Python程序语句
原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...
- 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm
***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...
最新文章
- linux进程间通信:命名管道FIFO
- 朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车
- 基于RBF和BP神经网络的信道估计算法的仿真与分析
- Unity新手教程:Roll-a-Ball游戏开发中的使用
- java的define,关于预处理器:Java中的#define
- [linux]服务器apache配置vhost
- 神龙架构没那么难理解—图解世界领先的阿里云神龙架构(一)缘起
- 数组——寄包柜(洛谷 P3613)
- springcloud断点续传源码_两套SpringCloud版的开源项目,项目源码和教程齐全
- 如何造一个移动端的联动选择器(三)
- udp 协议阻断_应对UDP反射放大攻击的五种常用防护思路
- LeetCode刷题(26)
- hadoop2.9.2安装hadoop_pid_dir_Hadoop3.2 +Spark3.0全分布式安装
- Netty NioEventLoop 启动过程源码分析
- 图像处理农业应用sci_SCI/SSCI期刊资源(4月20日更新)
- Android 仿淘宝首页界面
- Tensorflow可视化好助手 Tensorboard (四)-Deep Learning
- 网利友联CEO王卫平受邀坐客飞官七直播间
- 几个项目管理经典小故事,发人深思
- 中创向心力:如何把思想政治教育贯穿职业教育全过程?