专栏首页小数志3道数据分析师面试题实录

3道数据分析师面试题实录

导读

今天参加了一场数据分析师面试,遴选3道记录以资后鉴。

1. SQL求两表差集

用SQL实现黄色部分查询

求差集在其他SQL语句中存在关键词Except的用法,而MySQL中没有,所以需要用其他方法折中实现。但实现本身也不难。

以公共字段为id示例,提供两种常规思路:

  • 利用子查询

用最常规的语法(说人话的实现语句)是用in:

SELECT * 
FROM A 
WHERE id not in (SELECT id FROM B)

当然,能用关键字in实现的语句基本上都可以用exists实现:

SELECT * 
FROM A 
WHERE not exists (SELECT 1 FROM B WHERE A.id=B.id)

用子查询实现逻辑简单,语句更为直接,但执行效率一般较差,至于用in还是exists又要取决于索引情况和A、B两表数据规模情况。

  • 利用表连接查询

实现两表差集更为可取的做法是用表连接:

SELECT A.* 
FROM A left join B 
    using(id)
WHERE B.id is null

表连接方式更为高效,如果当B表较大但id列存在有效索引时,实际上还存在一点优化的空间和技巧:

SELECT A.* 
FROM A left join 
    (SELECT id FROM B) C 
    using(id) 
WHERE C.id is null

这里假定B表id字段已建立索引,进而通过覆盖索引查询B表id字段形成衍生表C,会大大加速查询过程,进而优化表连接查询结果。

2. 64匹马竞技取前4

实话说,这道题曾经见过,但无奈当时并未仔细思考。面试现场,脑中想到了可能的解决框架:

  • 64匹马用8条赛道,取前4,这是mapreduce模型啊,问题是怎么reduce出TOP4来
  • 64取前4,这是排序算法中快排的套路:无需关注具体排名,仅需查询TOP4即可

实际上,实现起来却尽是浆糊,剪不断理还乱。最后,只能给出中规中矩的晋级策略,也是最常规和最差的方案:每8匹马取前4,逐轮晋级,64→32→16→8→4,共需15轮。

而更为理想的策略仅需10-11轮:

  • 64匹马分8组,每组单独竞技,各取前4作为候选空间

第1-8轮竞技

  • 为加快区分度,取各组第1名共8匹马进行竞技,记录排名

第9轮竞技

经过此轮,能得到很多信息量:

  1. 第1名是总冠军,且其原来所在组的2-4名均可能是总排名前4
  2. 第2、3、4名所在组仅需分别保留3-2-1匹马作为总排名前4的候选空间
  3. 此时问题转化为9选3
  • 9匹马中,选择其中的8匹竞技,取前3。这里,9选8的策略有很多,但最好的方案是期望经过此轮后无需考虑剩下的那匹马,也就是说将最不可能进入总排名前4的马作为备选。因此,最为理想的选择是将总冠军那一组的第4名作为备选马,确保该组第2名或第3名未进入8选3结果中,无需再考虑备选的第4名,否则才需加赛。当然,将第二列的第三名作为备选也会得到相同的期望。

第10轮,选出最终2-3-4名

最终,总轮次仅需10-11轮。

3. 业务异常点分析

业务面中,遇到了一个经典的异常业务数据分析题,虽然是一道主观题,但实际上也是有框架的,不幸的是自己当时陷入了分析陷阱中:想当然的顺着面试官的暗示,将这个问题归结为一定是异常,然后展开具体分析。而更一般的分析框架应该是这样的:

业务异常点分析思路框架

本文分享自微信公众号 - 小数志(Datazhi),作者:luanhz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分享几道LeetCode中的MySQL题目解法

    最近刷完了LeetCode中的所有数据库题目,深深感到有些题目还是非常有深度和代表性的,而且比较贴合实际应用场景,特此发文以作分享。

    luanhz
  • MySQL中查询中位数?

    计算中位数可能是小学的内容,然而在数据库查询中实现却并不是一件容易的事。我们今天就来看看都有哪些方法可以实现。

    luanhz
  • 应用Python递归求解“八皇后”问题

    八皇后问题是一个古老的问题(1848年),也是算法和编程领域的经典话题,常常是应用递归求解的范例。

    luanhz
  • mysql常用功能之删除一张表中重复数据&ab表中a存在b不存在的 数据

    今天遇到一个问题。相同的数据在同一张表里出现了多次。我的需求是删除多余的数据,但要保留其中一条。 定义 表明 table_a ,判断唯一的两个字段 c_1,c...

    凯哥Java
  • 如何查询Oracle和MSSQL中某表在哪些存储过程中被使用

    崔文远TroyCui
  • 重新学习Mysql数据库1:无废话MySQL入门

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • MySQL8功能详解——Common table expression (CTE)

    Common table expression (CTE)通用表表达式是MySQL8推出的新功能。它是一种临时表,使用“WITH”命令,可以执行递归查询。

    MySQLSE
  • 偏离航道的无人机大疆

    在无人机行业消费级市场,我国有一家公司做到了全球领先,超过7成的全球民用市占率让它成为了当之无愧的无人机“垄断型企业”,这家公司就是大疆。

    刘旷
  • MongoDB最简单的入门教程之五-通过Restful API访问MongoDB

    通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通...

    Jerry Wang
  • mapper.xml相关语法

    一般在列表页面,有多个查询条件,并且不确定条件是否使用的时候可以使用 if test语法

    java攻城狮

扫码关注云+社区

领取腾讯云代金券