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

简介:

【题目】

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

【解题思路】

使用逻辑树分析方法可以把这个复杂的问题拆解为3个子问题:
1)找出访问次数前20%的用户
2)剔除访问次数前20%的用户
3)每类用户的平均访问次数

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

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

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

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

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.每类用户的平均访问次数

当“每个”出现的时候,就要想到《猴子 从零学会sql》里讲过的这时候就是要分组汇总了。

按“用户类型”分组(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.面对复杂问题的分析能力

要会使用逻辑树分析方法将复杂问题拆解成简单问题排名问题使用窗口函数来实现。

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

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;

推荐:如何从零学会sql?

猴子聊人物
推荐搜索
数据分析分析方法图解面试题

相关文章
|
6月前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
442 2
|
6月前
|
SQL 缓存 easyexcel
面试官问10W 行级别数据的 Excel 导入如何10秒处理
面试官问10W 行级别数据的 Excel 导入如何10秒处理
259 0
|
6月前
|
编解码 移动开发 前端开发
【面试题】 给你十万条数据,怎么样顺滑的渲染出来?
【面试题】 给你十万条数据,怎么样顺滑的渲染出来?
|
6月前
|
前端开发 JavaScript
【面试题】面试官:如果后端给你 1w 条数据,你如何做展示?
【面试题】面试官:如果后端给你 1w 条数据,你如何做展示?
|
12天前
|
存储 缓存 关系型数据库
滴滴面试:单表可以存200亿数据吗?单表真的只能存2000W,为什么?
40岁老架构师尼恩在其读者交流群中分享了一系列关于InnoDB B+树索引的面试题及解答。这些问题包括B+树的高度、存储容量、千万级大表的优化、单表数据量限制等。尼恩详细解释了InnoDB的存储结构、B+树的磁盘文件格式、索引数据结构、磁盘I/O次数和耗时,以及Buffer Pool缓存机制对性能的影响。他还提供了实际操作步骤,帮助读者通过元数据找到B+树的高度。尼恩强调,通过系统化的学习和准备,可以大幅提升面试表现,实现“offer直提”。相关资料和PDF可在其公众号【技术自由圈】获取。
|
17天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
45 1
|
20天前
|
存储 关系型数据库 MySQL
面试官:MySQL一次到底插入多少条数据合适啊?
本文探讨了数据库插入操作的基础知识、批量插入的优势与挑战,以及如何确定合适的插入数据量。通过面试对话的形式,详细解析了单条插入与批量插入的区别,磁盘I/O、内存使用、事务大小和锁策略等关键因素。最后,结合MyBatis框架,提供了实际应用中的批量插入策略和优化建议。希望读者不仅能掌握技术细节,还能理解背后的原理,从而更好地优化数据库性能。
|
23天前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
36 0
|
3月前
|
Java
【Java基础面试五】、 int类型的数据范围是多少?
这篇文章回答了Java中`int`类型数据的范围是-2^31到2^31-1,并提供了其他基本数据类型的内存占用和数值范围信息。
【Java基础面试五】、 int类型的数据范围是多少?
|
4月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略