免费教程《图解 SQL 面试题》
  • 图解 SQL 面试题
  • 第 1 章:简单查询
  • 图解面试题:如何查找重复数据?
  • 第 2 章:复杂查询
    • 图解面试题:如何查找第 N 高的数据?
  • 第 3 章 多表查询?
    • 图解面试题:多表如何查询?
    • 图解面试题:如何查找不在表里的数据?
    • 图解面试题:你有多久没涨过工资了?
    • 图解面试题:如何比较日期数据?
    • 图解面试题:如何交换数据?
    • 滴滴 2020 年面试题:如何找出最小的 N 个数?
    • 图解面试题:行列互换问题,怎么办?
    • 图解面试题:找出连续出现 N 次的内容?
    • 链家面试题:如何分析留存率?
  • 第 4 章
    • 拼多多面试题:如何查找前 20% 的数据?
    • 图解面试题:如何查找工资前三高的员工
    • 图解面试题:如何分组比较?
    • 图解面试题:双 11 用户如何分析?
    • 图解面试题:如何分析游戏?
  • 第 5 章:项目实战
    • 图解面试题:滴滴 2020 求职真题
    • 滴滴面试题:打车业务问题如何分析?
    • 电商面试题:如何分析复杂业务?
    • 图解面试题:如何分析用户满意度?
    • 图解面试题:如何分析红包领取情况?
    • 图解面试题:如何分析中位数?
    • 小红书面试题:如何分析用户行为?
    • 教育行业案例:学员续费如何分析?
    • 字节跳动面试题:你的平均薪水是多少?
Powered by GitBook
On this page

Was this helpful?

  1. 第 5 章:项目实战

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

Previous图解面试题:如何分析红包领取情况?Next小红书面试题:如何分析用户行为?

Last updated 4 years ago

Was this helpful?

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

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

解释:

第 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.要求每个岗位的中位数位置的范围,需要知道每个岗位的总数

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

select 岗位,count(*) as 总数
from 成绩表
group by 岗位;

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

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

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

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

(1) 总数 % 2 = 1

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

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

(1) 总数 % 2 = 0

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

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

select 岗位,
(case when 总数 % 2 = 1 then (总数+1)/2 else 总数/2 end) as 起始位置,
(case when 总数 % 2 = 1 then (总数+1)/2 else 总数/2+1 end) as 结束位置
from
(select 岗位,count(*) as 总数
from 成绩表
group by 岗位) as t;

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

select 岗位,
(case when 总数 % 2 = 1 then (总数+1)/2 else 总数/2 end) as 起始位置,
(case when 总数 % 2 = 1 then (总数+1)/2 else 总数/2+1 end) as 结束位置
from
(select 岗位,count(*) as 总数
from 成绩表
group by 岗位) as t
order by 岗位;

【本题考点】

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

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

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

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

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

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

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

【举一反三】

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

select 科目,
(case when 总数 % 2 = 1 then (总数+1)/2 else 总数/2 end) as 起始位置,
(case when 总数 % 2 = 1 then (总数+1)/2 else 总数/2+1 end) as 结束位置
from
(select 科目,count(*) as 总数
from 科目成绩表
group by 科目) as t
order by 科目;

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

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

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

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

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

《猴子 从零学会 SQL》
子查询
多维度拆解分析方法
推荐:如何从零学会 sql?