求中位数_图解面试题:如何分析中位数?

39e71881fc4e2f9d87738645533ab508.png


学校每次考试完,都会有一个成绩表。例如,表中第1行表示编号为1的用户选择了C++岗位,该科目考了11001分。

fe25318ca3f91084f1a896cb592e680c.png

问题:写一个sql语句查询每个岗位的中位数位置的范围,并且按岗位升序排序,结果如下:

c74db1e53be0dff2bd34266d5c3ac8bf.png

解释:

第1行表示C++岗位的中位数位置范围为[2,2],也就是2。因为C++岗位总共3个人,是奇数,所以中位数位置为2。

第2行表示Java岗位的中位数位置范围为[1,2]。因为Java岗位总共2个人,是偶数,所以要知道中位数,需要知道2个位置的数字,而因为只有2个人,所以中位数位置为[1,2]。

第3行表示前端岗位的中位数位置范围为[2,2],也就是2。因为前端岗位总共3个人,是奇数,所以中位数位置为2。

【解题步骤】

1.要求每个岗位的中位数位置的范围,需要知道每个岗位的总数

那么,如何求每个岗位的总数呢?

看到“每个”,要想到《猴子 从零学会SQL》里讲过的,用分组汇总解决这类型问题。按岗位分组(group by),使用汇总函数count()得到岗位总数。

53a1747cbb3866969313d4b4d5cc8de4.png

202a3d599ab6fa5cfb41279d7131ffbd.png

2.岗位总数又分为奇数和偶数两种情况。

e9a26955dc7148609c384d02afbc5cae.png

岗位数有奇数也有偶数,需要分情况进行计算,可以使用case表达式。

70232c5ba11752e8b4b8f4872f7ec1a1.png

如何判断奇偶呢?我们可以使用%或mod函数。

奇数,就是除以2的余数为1,可以用下面两种方法表示

(1) 总数 % 2 = 1

(2) mod(总数,2) = 1

偶数,就是除以2的余数为0,可以用下面两种方法表示

(1) 总数 % 2 = 0

(2) mod(总数,2) = 0

再结合求中位数起始位置的关系,使用case表达式:

e9a26955dc7148609c384d02afbc5cae.png

8051ade4a33b3a7627581d57aa6358fd.png

而case表达式中的总数是由前面使用第1步count()函数计算出来的,所以第1步要先于case语句运行,因为要把第1步的sql作为子查询。

16373b6ca449f49d747a1236ea890463.png

最后按岗位升序排序,用排序子句(order by)

b1dd81415411995e6a7920d12a16e192.png

5de837973dfdaec2f0d8289b1b9b030f.png

【本题考点】

1.考察如何将复杂问题拆解为简单问题,可以使用多维度拆解分析方法,例如本案例中问题拆解问3步:

1)将中位数位置用公式表示出来

2)计算出每个岗位的总数

2)分情况统计总数的奇数、偶数

2.如何用%或mod函数判断奇偶

3.每个问题,要想到分组汇总来解决

4.多条件判断问题,要想到用case表达式

5.考查sql的运行顺序和子查询

【举一反三】

以下是某班同学的科目成绩表,查询每门科目的中位数位置的范围,并且按科目升序排序。

a67b80d485e0d8201ad2ef92250f862a.png

caa8757a26c6238e67483fe100161f1f.png

7f95cf900cbe733f02bf85557fd59755.png

第1行表示数学科目的中位数位置范围为[2,2],也就是2。因为数学科目总共3个人,是奇数,所以中位数位置为2。

第2行表示语文科目的中位数位置范围为[2,3]。因为Java岗位总共4个人,是偶数,所以要知道中位数,需要知道2个位置的数字,而因为只有4个人,所以中位数位置为[2,3]。

推荐:如何从零学会sql?

bbee1245a037bfd00dbb26a79c072aa1.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值