众数的概念

众数作为统计学中重要的概念,它指在群体出现次数最多的值,在下面这张表中,众数是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-计算众数、中位数相关推荐

  1. 一文搞懂faiss计算

    Faiss的全称是Facebook AI Similarity Search. 这是一个开源库,针对高维空间中的海量数据,提供了高效且可靠的检索方法. 暴力检索耗时巨大,对于一个要求实时人脸识别的应用 ...

  2. 一文搞懂 SQL:基础知识和业务实践总结

    作者:cooperyjli,腾讯 CDG 数据分析师 SQL的全称是Structured Query Language(结构化查询语言),是一种古老而简洁的程序设计语言.看似平平无奇,一直被各种吐槽, ...

  3. 从零入门 Serverless | 一文搞懂函数计算及其工作原理

    作者 | 孔德慧(夏莞)  阿里云函数计算开发工程师 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门" ...

  4. 从零入门Serverless|一文搞懂函数计算及其工作原理

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 什么是函数计算? 大家都了解,Serverless 并不是没有服务器,而是开发者不再需要关心服务器 ...

  5. 一文搞懂SQL注入攻击

    SQL注入攻击 1. 前言 2. SQL注入简介 3. SQL注入步骤 4. 防范SQL注入 1. 前言 随着互联网的发展和普及,网络安全问题越来越突出,网络在为用户提供越来越多服务的同时,也要面对各 ...

  6. 一文搞懂SQL中的各种联结——内联结、自然联结、自联结、交叉联结

    一.概述 所谓" 联结 "指的是数据表和本身,以及不同数据表之间的" 联结关系 ".常见的联结有自连接.自然连接.内连接.外联结.完全连接等等.本文以SQLit ...

  7. 一文搞懂MySQL数据库分库分表

    如果数据量过大,大家一般会分库分表.分库需要注意的内容比较少,但分表需要注意的内容就多了. 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过 ...

  8. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  9. 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm

    ***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...

最新文章

  1. linux进程间通信:命名管道FIFO
  2. 朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车
  3. 基于RBF和BP神经网络的信道估计算法的仿真与分析
  4. Unity新手教程:Roll-a-Ball游戏开发中的使用
  5. java的define,关于预处理器:Java中的#define
  6. [linux]服务器apache配置vhost
  7. 神龙架构没那么难理解—图解世界领先的阿里云神龙架构(一)缘起
  8. 数组——寄包柜(洛谷 P3613)
  9. springcloud断点续传源码_两套SpringCloud版的开源项目,项目源码和教程齐全
  10. 如何造一个移动端的联动选择器(三)
  11. udp 协议阻断_应对UDP反射放大攻击的五种常用防护思路
  12. LeetCode刷题(26)
  13. hadoop2.9.2安装hadoop_pid_dir_Hadoop3.2 +Spark3.0全分布式安装
  14. Netty NioEventLoop 启动过程源码分析
  15. 图像处理农业应用sci_SCI/SSCI期刊资源(4月20日更新)
  16. Android 仿淘宝首页界面
  17. Tensorflow可视化好助手 Tensorboard (四)-Deep Learning
  18. 网利友联CEO王卫平受邀坐客飞官七直播间
  19. 几个项目管理经典小故事,发人深思
  20. 中创向心力:如何把思想政治教育贯穿职业教育全过程?

热门文章

  1. 营销模块数据库表解析:限时购功能
  2. DSP6455的cmd文件
  3. 【BPM技术】Zeebe是一个用于微服务编排的工作流引擎。
  4. ACID和BASE之间的一致性、可用性和分区宽容度(CAP)
  5. 微信小程序自实现loading
  6. 赢了官司,输了offer《打工人的那些事》
  7. php获取中文城市首字母排序,PHP实现获取第一个中文首字母并进行排序的方法
  8. Windows设置软件开机自启动
  9. oracle清除temp表空间,Oracle 11G清理临时表空间
  10. OSChina 周四乱弹 —— 去跳跳广场舞不好么