一、提要
作为一名数据工作人员,SQL是日常工作中最常用的数据提取&简单预处理语言。因为其使用的广泛性和易学程度也被其他岗位比如产品经理、研发广泛学习使用,本篇文章主要结合经典面试题,给出通过数据开发面试的SQL方法与实战。以下题目均来于笔者经历&网上分享的中高难度SQL题。
二、解题思路
简单——会考察一些group by & limit之类的用法,或者平时用的不多的函数比如rand()类;会涉及到一些表之间的关联
中等——会考察一些窗口函数的基本用法;会有表之间的关联,相对tricky的地方在于会有一些自关联的使用
困难——会有中位数或者更加复杂的取数概念,可能要求按照某特定要求生成列;一般这种题建中间表会解得清晰些
三、SQL真题
第一题
order订单表,字段为:goods_id, amount ;
pv 浏览表,字段为:goods_id,uid;
goods按照总销售金额排序,分成top10,top10~top20,其他三组
求每组商品的浏览用户数(同组内同一用户只能算一次)
第二题
商品活动表 goods_event,g_id(有可能重复),t1(开始时间),t2(结束时间)
给定时间段(t3,t4),求在时间段内做活动的商品数
1.
第三题
商品活动流水表,表名为event,字段:goods_id, time;
求参加活动次数最多的商品的最近一次参加活动的时间
第四题
用户登录的log数据,划定session,同一个用户一个小时之内的登录算一个session;
生成session列
第五题
订单表,字段有订单编号和时间;
取每月最后一天的最后三笔订单
第六题
数据库表Tourists,记录了某个景点7月份每天来访游客的数量如下:
id date visits 1 2017-07-01 100 …… 非常巧,id字段刚好等于日期里面的几号。
现在请筛选出连续三天都有大于100天的日期。
上面例子的输出为:date 2017-07-01 ……
第七题
现有A表,有21个列,第一列id,剩余列为特征字段,列名从d1-d20,共10W条数据!
另外一个表B称为模式表,和A表结构一样,共5W条数据
请找到A表中的特征符合B表中模式的数据,并记录下相对应的id
有两种情况满足要求:
- 每个特征列都完全匹配的情况下
- 最多有一个特征列不匹配,其他19个特征列都完全匹配,但哪个列不匹配未知
第八题
我们把用户对商品的评分用稀疏向量表示,保存在数据库表t里面:
- t的字段有:uid,goods_id,star。uid是用户id
- goodsid是商品id = star是用户对该商品的评分,值为1-5
现在我们想要计算向量两两之间的内积,内积在这里的语义为:
对于两个不同的用户,如果他们都对同样的一批商品打了分,那么对于这里面的每个人的分数乘起来,并对这些乘积求和。
例子,数据库表里有以下的数据:
计算后的结果为:
U0 U1 23+41=10 ……
第九题
给出一堆数和频数的表格,统计这一堆数中位数
第十题
表order有三个字段,店铺ID,订单时间,订单金额
查询一个月内每周都有销量的店铺