公众号后台回复“图书“,了解更多号主新书内容作者:胖里来源:  胖里的日常

先来看看中位数的概念

中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。

百度百科

说到中位数,大家应该都不陌生。中位数是九年义务教育中数学里的一个重要概念,想当初刚学习的时候会经常对平均数、中位数、众数进行比较,比较它们的优缺点是什么,什么情况下应该用哪一种数。

不知道大家日常数据分析工作中是否会用到中位数的求取,如果是通过Excel、Python等进行数据分析、可视化展示,那这两款软件都有其对应的求中位数的函数,分别是median()和numpy库中的median()。如果写SQL的时候用到,可能就没有那么现成的函数了。(oracle中有求取中位数的函数)

除了日常工作,数据分析的笔面试中也经常会出现中位数求取的考察。今天就总结三种用SQL求取中位数的方法。

方法1:充分利用窗口函数

思路介绍:

根据中位数的概念,想要求取中位数,需要对一组数据进行排序,找出居于中间位置的数,如果有奇数个数,那最中间的一个为中位数,如果有偶数个数,那中间两个数的平均数为中位数。因此我们需要实现的是排序,取中间值或中间两值的平均值,既然涉及到中间这种位置定位,那自然少不了编号与总体个数的比较。

因此可以概括为排序、编号、找位置、取值。那就需要考虑到排序函数row_number()、计数函数cout()、求均值函数avg()。

示例:

有一组数:1,3,55,8,34,66,42,88,SQL找出中位数。

按照先前的思路,使用相关函数实现:

select avg(num)
from
(select num ,row_number() over(order by num) as rn ,count(*) over() as nfrom tmp
)as t
where rn in (floor(n/2)+1,if(mod(n,2) = 0,floor(n/2),floor(n/2)+1))

先使用row_number()函数对数据从小到大进行排序标号,用count()顺便实现数据总数的记录,假设为n个。如果n为奇数,则取最中间一个值作为中位数,也就是编号为floor(n/2)+1的数,如果n为偶数,需要取中间位置的两个数,也就是floor(n/2)和floor(n/2)+1的两个数。因此可以将floor(n/2)+1作为一个rn的取值,另一个通过判断奇偶性来选择。

当然思路一致,你选择不同的函数实现也是可以的,比如不用if用case when来判断。

方法2:正排倒排来一遍法

思路介绍:

不妨这样想一想,还是根据中位数的概念,一组数据想求中位数,那么这个数或这两个数肯定在一组排序好的数据的中间位置,那是不是正排和倒排的编号会存在某种规律?

假设有一组数:33,25,4,63,18(奇数个),正排和倒排编号之后如下。

假设还有一组数:33,25,4,63,18,22(偶数个),正排和倒排编号之后如下。

观察上述两个示例,会发现由于中位数的独特魅力所在,无论正排还是倒排,对于奇数个数来说,其编号始终不变,而对于偶数个数来说,两个中位数(取均值)的编号相差±1。

按照上述观察结果,就可以得到另一种求中位数的思路,也就是对数据进行正排和倒排,编号,按照奇偶两种条件进行限制,求得编号是这两种条件的一个值或两个值的平均数作为中位数。

示例:

有一组数:1,3,55,8,34,66,42,88,SQL找出中位数。

按照先前的思路,使用相关函数实现:

select avg(num)
from
(select num ,row_number() over(order by num) as rn1,row_number() over(order by num desc) as rn2from tmp
)as t
where rn1 = rn2 or abs(rn1-rn2) = 1

此处需要注意一个问题,上述SQL代码用MySQL跑时,会报错,需要设置下参数,SET sql_mode='NO_UNSIGNED_SUBTRACTION'

还有,我们不得不考虑这样一种情况,如果待求中位数的数据中存在相等的数怎么办?比如下图的示例,出现了多个重复数据,对于相同的值使用row_number()函数可能不能实现像我们预期那样的正排倒排,此时若按照rn1 = rn2或abs(rn1 - rn2)相差1这两个条件进行限制只能得到6,但实际上中位数为2和6的平均数。

因此为了达到预期想要的正排倒排的效果,可以使用主键id跟着要排序的数据进行正排倒排,保证正排和倒排数据的编号走向处处相反。

select avg(num)
from
(select id,num ,row_number() over(order by num, id) as rn1,row_number() over(order by num desc, id desc) as rn2from tmp
)as t
where rn1 = rn2 or abs(rn1-rn2) = 1

难道求中位数只能通过排序?不排序可以找到中位数吗?我们来看看方法三。

方法三:自连接比较法

思路介绍:

我们可以想一想,除了被动排序编号,这些数据是不是可以主动一把?一个数A可以主动去跟别的数作比较,如果比别的数小则+1,比别的数大则-1,这+1,-1加和是不是能表示这个数的“地位”,也就是变相的表征如果按大小排序,是排在什么样的位置上。是不是也就意味着+1,-1加和得到的结果(绝对值)越小,这个数越处于居中位置?

举个例子。

有这么一组数据:1,2,3,4,5,6。按照刚刚描述,对它们分别求取一个加和结果margin和margin的绝对值。

从图上可以看到,3和4对应的margin的绝对值最小,因此它们两个就是居中的数。通过这个例子是否能get此方法?是否能得到某个处于中间位置的值,或某两个处于中间位置的值?

当然上述示例比较简单,再多考虑一下,这种操作对于有重复值的适用吗?

我们看图中这个示例,数据中存在多个重复值,按刚刚的思路,margin绝对值最小的num即为中位数,但此示例中显然不是,2和6的均值才是中位数。

此时要想沿用之前的思路,就得加限制条件,也就是统计下与该数相等的数的个数,记为equal,毕竟个数会影响到num的位置。选出equal大于或等于margin绝对值的num,也就是2和6。

按照目前的思路,使用相关语句实现:

select avg(num)
from
(select t1.num ,abs(sum(sign(t2.num-t1.num))) as margin,sum(if(t1.num = t2.num,1,0)) as equalfrom (select num from tmp )as t1 inner join (select num from tmp)as t2 group by t1.num
)as t
where equal >= margin

以上便是我今天分享的三种使用SQL进行中位数求取的方法。当然大家也可以考虑下是否存在某些现成的计算分位数的函数,毕竟中位数就是二分位数,直接使用函数可比写SQL来的容易。如此看来,此考题的目的就是考你对于中位数的理解,考你的思路和方法了。

至于与中位数相关的笔试题目我这边就不做赘述了,大家可以去网站上搜搜看,有类似的题目,现实中也有相关应用。比如求各科成绩的中位数、各部门员工薪资的中位数等等。实例有很多,可以自己结合现成函数或上述方法操作看看。

如果你有更好地求中位数的方法或文中有何不妥之处,欢迎交流~可以通过

◆ ◆ ◆  ◆ ◆
麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗

SQL笔面试题:如何求取中位数?相关推荐

  1. sql 以a开头的所有记录_#9#猴子聊数据分析之常见的SQL笔试题和面试题(下)

    题目来源 猴子:常见的SQL笔试题和面试题(下)​zhuanlan.zhihu.com 1.SQL语言允许使用通配符进行字符串匹配的操作,其中'%'可以表示:多个字符 2.通过 SQL,如何从 &qu ...

  2. 常见的SQL笔试题和面试题:SQL经典50题

    常见的SQL笔试题和面试题(上):经典50题 已知有如下4张表: 学生表:STUDENT(S#,SNAME,SAGE,SSEX) 课程表:COURSE(C#,CNAME,T#) 成绩表:SC(S#,C ...

  3. SQL Server 下取中位数(中位值)的方法

    中位数是指将数据按大小顺序排列起来,形成一个数列,居于数列中间位置的那个数据.中位数用Me表示. 从中位数的定义可知,所研究的数据中有一半小于中位数,一半大于中位数.中位数的作用与算术平均数相近,也是 ...

  4. mysql求中位值函数_SQLServer下取中位数(中位值)的方法

    将数据排序后,位置在最中间的数值.即将数据分成两部分,一部分大于该数值,一部分小于该数值.中位数的位置:当样本数为奇数时 中位数是指将数据按大小顺序排列起来,形成一个数列,居于数列中间位置的那个数据. ...

  5. oracle sql 题目,oracle sql笔试题

    oracle sql笔试题 一. 数据库 ORACLE 虽然这些题目都可以G到,但还是要考察一下您现在的常态水平,:) T表:(字段:ID,NAME,ADDRESS,PHONE,LOGDATE) E表 ...

  6. 【笔试/面试】SQL 经典面试题

    基本概念 (1)any/all,构成 where 子句的条件判断,any:表示或(or)的概念,all:则表示与(and)的概念,这两个关键字的出现是为了语句的简化: (2)先分组再做聚合,逻辑上也应 ...

  7. Hive SQL经典面试题:统计连续登陆的三天及以上的用户

    Hive SQL经典面试题 最近发现一道大数据面试经常会问的SQL题目:统计连续登录的三天及以上的用户(或者类似的:连续3个月充值会员用户.连续N天购买商品的用户等),下面就来记录一下解题思路. 要求 ...

  8. java 获取每月每一天_java 求取某一段时间内的每一天、每一月、每一年

    1.求取某一段时间内的每一天 Date date0 = new SimpleDateFormat("yyyy-MM-dd").parse("2014-01-01" ...

  9. ❤️万字阿里技术岗笔面试题+参考答案,自信的可以来试试❤️建议收藏

    前些日子在网上偶然间看到了一波阿里的技术笔面试题,自己自信地尝试做了一波,但结果很可惜,在不上网搜参考的情况下,20道题我只做出来8个-真尴尬. 题目水平高低起伏,这里我先把所有题目给大家看一遍,大多 ...

  10. hive sql系列(三)——求所有用户和活跃用户的总数及平均年龄

    每天分享一个sql,帮助大家找到sql的快乐 需求:求所有用户和活跃用户的总数及平均年龄 建表语句 create table user_age(dt string,user_id string,age ...

最新文章

  1. 浪潮小机装oracle数据库,浪潮ERP系统oracle双机热备安装文档 | 浪潮888博客
  2. Javascript 节点 全面解析
  3. [转载]ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection
  4. 互斥同步(synchronized、Lock、ReentrantLock、ReadWriteLock、ReentrantReadWriteLock)
  5. GDCM:DICOM PS 3.10文件格式的测试程序
  6. FFmpeg AVCodecContext结构体debug变量剖析
  7. 【CentOS7】安装 mysql client 5.7
  8. 在ubuntu上如何将多张图片或PDF合到一个PDF上
  9. 我的Android进阶之旅------Android利用Sensor(传感器)实现水平仪功能的小例
  10. The content of element type configuration must match (properties?,settings?,typeAliases?,typeHand...
  11. 移植qt5.3.1到arm
  12. 深入理解前端跨域问题的解决方案——前端面试
  13. zabbix详解(三)——zabbix源码安装与部署
  14. 图片轮流翻转,一直循环
  15. 计算机应用基础 (2013),计算机应用基础
  16. android 获取默认字体,Android中的默认字体系列是什么?
  17. 进行maya特效的学习
  18. 吉他谱_C调往后余生(新手友好
  19. java 累加器_09-flink-Accumulator(累加器)
  20. JAVAEE 实训日志 一

热门文章

  1. 一文了解人工智能——学科介绍、发展史、三大学派
  2. 个人价值:个人价值冰山模型
  3. 打造爆款关键词选择10种方法
  4. win10无法防问其他计算机没有权限,win10系统访问磁盘共享没有权限的解决方案...
  5. Vista 陪我过周末
  6. AWK手册(ZYF译)
  7. 网站死链接检测与完美处理方法
  8. 流媒体有哪些播放方式?流媒体视频三种播放方式介绍
  9. excel合并两列内容_Excel 两列合并成一列,又一种快捷方法!
  10. QT串口助手(五):文件操作