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

Was this helpful?

  1. 第 4 章

拼多多面试题:如何查找前 20% 的数据?

Previous链家面试题:如何分析留存率?Next图解面试题:如何查找工资前三高的员工

Last updated 4 years ago

Was this helpful?

【题目】

用户访问次数表,列名包括用户编号、用户类型、访问量。要求在剔除访问次数前 20% 的用户后,每类用户的平均访问次数。(拼多多、网易面试题)

【解题思路】

1)找出访问次数前 20% 的用户

2)剔除访问次数前 20% 的用户

3)每类用户的平均访问次数

下面分别来解决每个子问题

1. 访问次数前 20% 的用户

首先对所有用户的访问量按从低到高的顺序用窗口函数排名:

select *,
      row_number() over(order by 访问量 desc) as 排名
from 用户访问次数表;

排名后,如何找出前 20% 的数据呢?

排名 <= 最大的排名值 * 20%, 就是前 20% 的数据。

把前面的排名结果表当作临时表 a,加上筛选条件(where)对应的 sql 语句如下:

select * 
from a
where 排名<= 最大的排名 * 0.2;

最大的排名值如何得到呢?可以用下面的 sql 语句:

select max(排名)
from a;

把前面的 sql 语句组合到一起就得到了筛选出排名前 20% 的数据了:

select * 
from a
where 排名<= (select max(排名) from a) * 0.2;

2. 剔除访问次数前 20% 的用户

题目要求是 “剔除访问次数前 20% 的用户”,也就是把上面 sql 语句里的 where 条件中的 <= 变成 > 就获取到相反的数据了。

select * 
from a
where 排名 > (select max(排名) from a) * 0.2;

把前面得到的临时表 a 的 sql 语句带入后就是:

select * 
from 
(select *,
       row_number() over(order by 访问量 desc) as 排名
from 用户访问次数表) as a
where 排名 > (select max(排名) from a) * 0.2;

3. 每类用户的平均访问次数

按 “用户类型” 分组(group by),然后汇总求平均访问次数 avg(访问次数)。

select 用户类型,avg(访问量)
from b
group by 用户类型;

这里的表 b 就是前面第 2 步得到的临时表,带入 sql 里就是:

select 用户类型,avg(访问量)
from 
(select * 
from 
(select *,
       row_number() over(order by 访问量 desc) as 排名
from 用户访问次数表) as a
where 排名 > (select max(排名) from a) * 0.2) as b
group by 用户类型;

【本题考点】

1.面对复杂问题的分析能力

2.当有 “每个” 出现的时候,要想到用分组汇总,下图是常用的汇总函数

3.选出前百分之 N 的问题如何解决?下面是这类问题的解决模版

1)先使用窗口函数对数据排名得到临时表 a

select *,
       row_number() over(order by 排名的列 desc) as 排名
from 表名;

2)然后用表 a 筛选出前百分之 N 的数据

select * 
from a
where 排名 <= (select max(排名) from a) * 百分之N;

3)如果是剔除前前百分之 N 的数据,也就是选出后 (1 - 百分之 N) 的数据。例如选出后 80% 的数据,就把上面的 where 子句里的 <= 修改成 >

select * 
from a
where 排名 > (select max(排名) from a) * 百分之N;

使用可以把这个复杂的问题拆解为 3 个子问题:

先按 “访问次数” 排名,然后就可以找到”前 20%”的数据。排名问题在里讲过可以用窗口函数来解决。

当 “每个” 出现的时候,就要想到里讲过的这时候就是要分组汇总了。

要会使用将复杂问题拆解成简单问题排名问题使用窗口函数来实现。

推荐:

逻辑树分析方法
《猴子 从零学会 sql》
《猴子 从零学会 sql》
逻辑树分析方法
如何从零学会 sql?