大数据面试之SQL面试题

2023-11-20

一、提要

作为一名数据工作人员,SQL是日常工作中最常用的数据提取&简单预处理语言。因为其使用的广泛性和易学程度也被其他岗位比如产品经理、研发广泛学习使用,本篇文章主要结合经典面试题,给出通过数据开发面试的SQL方法与实战。

二、解题思路

  • 简单——会考察一些group by & limit之类的用法,或者平时用的不多的函数比如rand()类;会涉及到一些表之间的关联
  • 中等——会考察一些窗口函数的基本用法;会有表之间的关联,相对tricky的地方在于会有一些自关联的使用
  • 困难——会有中位数或者更加复杂的取数概念,可能要求按照某特定要求生成列;一般这种题建中间表会解得清晰些

三、SQL真题

第一题

  • order订单表,字段为:goods_id, amount ;
  • pv 浏览表,字段为:goods_id,uid;
  • goods按照总销售金额排序,分成top10,top10~top20,其他三组

求每组商品的浏览用户数(同组内同一用户只能算一次)

create table if not exists test.nil_goods_category as

select goods_id

,case when nn<= 10 then 'top10'

when nn<= 20 then 'top10~top20'

else 'other' end as goods_group

from

(

select goods_id

,row_number() over(partition by goods_id order by sale_sum desc) as nn

from

(

select goods_id,sum(amount) as sale_sum

from order

group by 1

) aa

) bb;

select b.goods_group,count(distinct a.uid) as num

from pv a

left join test.nil_goods_category b

on a.goods_id = b.goods_id

group by 1;

第二题

商品活动表 goods_event,g_id(有可能重复),t1(开始时间),t2(结束时间)

给定时间段(t3,t4),求在时间段内做活动的商品数

1.

select count(distinct g_id) as event_goods_num

from goods_event

where (t1<=t4 and t1>=t3)

or (t2>=t3 and t2<=t4)

2.

select count(distinct g_id) as event_goods_num

from goods_event

where (t1<=t4 and t1>=t3)

union all

第三题

商品活动流水表,表名为event,字段:goods_id, time;

求参加活动次数最多的商品的最近一次参加活动的时间

select a.goods_id,a.time

from event a

inner join

(

select goods_id,count(*)

from event

group by gooods_id

order by count(*) desc

limit 1

) b

on a.goods_id = b.goods_id

order by a.goods_id,a.time desc

第四题

用户登录的log数据,划定session,同一个用户一个小时之内的登录算一个session;

生成session列

drop table if exists koo.nil_temp0222_a2;

create table if not exists koo.nil_temp0222_a2 as

select *

,row_number() over(partition by userid order by inserttime) as nn1

from

(

select a.*

,b.inserttime as inserttime_aftr

,datediff(b.inserttime,a.inserttime) as session_diff

from

(

select userid,inserttime

,row_number() over(partition by userid order by inserttime asc) nn

from koo.nil_temp0222

where userid = 1900000169

) a

left join

(

select userid,inserttime

,row_number() over(partition by userid order by inserttime asc) nn

from koo.nil_temp0222

where userid = 1900000169

) b

on a.userid = b.userid and a.nn = b.nn-1

) aa

where session_diff >10 or nn = 1

order by userid,inserttime;

drop table if exists koo.nil_temp0222_a2_1;

create table if not exists koo.nil_temp0222_a2_1 as

select a.*

,case when b.nn is null then a.nn+3 else b.nn end as nn_end

from koo.nil_temp0222_a2 a

left join koo.nil_temp0222_a2 b

on a.userid = b.userid

and a.nn1 = b.nn1 - 1;

select a.*,b.nn1 as session_id

from

(

select userid,inserttime

,row_number() over(partition by userid order by inserttime asc) nn

from koo.nil_temp0222

where userid = 1900000169

) a

left join koo.nil_temp0222_a2_1 b

on a.userid = b.userid

and a.nn>=b.nn

and a.nn<b.nn_end

第五题

订单表,字段有订单编号和时间;

取每月最后一天的最后三笔订单

select *

from

(

select *

,rank() over(partition by mm order by dd desc) as nn1

,row_number() over(partition by mm,dd order by inserttime desc) as nn2

from

(select cast(right(to_date(inserttime),2) as int) as dd,month(inserttime) as mm,userid,inserttime

from koo.nil_temp0222) aa

) bb

where nn1 = 1 and nn2<=3;

第六题

数据库表Tourists,记录了某个景点7月份每天来访游客的数量如下:

id date visits 1 2017-07-01 100 …… 非常巧,id字段刚好等于日期里面的几号。

现在请筛选出连续三天都有大于100天的日期。

上面例子的输出为:date 2017-07-01 ……

select a.*,b.num as num2,c.num as num3

from table a

left join table b

on a.userid = b.userid

and a.dt = date_add(b.dt,-1)

left join table c

on a.userid = c.userid

and a.dt = date_add(c.dt,-2)

where b.num>100

and a.num>100

and c.num>100

第七题

现有A表,有21个列,第一列id,剩余列为特征字段,列名从d1-d20,共10W条数据!

另外一个表B称为模式表,和A表结构一样,共5W条数据

请找到A表中的特征符合B表中模式的数据,并记录下相对应的id

有两种情况满足要求:

  • 每个特征列都完全匹配的情况下
  • 最多有一个特征列不匹配,其他19个特征列都完全匹配,但哪个列不匹配未知

1.

select aa.*

from

(

select *,concat(d1,d2,d3……d20) as mmd

from table

) aa

left join

(

select id,concat(d1,d2,d3……d20) as mmd

from table

) bb

on aa.id = bb.id

and aa.mmd = bb.mmd

2.

select a.*,sum(d1_jp,d2_jp……,d20_jp) as same_judge

from

(

select a.*

,case when a.d1 = b.d1 then 1 else 0 end as d1_jp

,case when a.d2 = b.d2 then 1 else 0 end as d2_jp

,case when a.d3 = b.d3 then 1 else 0 end as d3_jp

,case when a.d4 = b.d4 then 1 else 0 end as d4_jp

,case when a.d5 = b.d5 then 1 else 0 end as d5_jp

,case when a.d6 = b.d6 then 1 else 0 end as d6_jp

,case when a.d7 = b.d7 then 1 else 0 end as d7_jp

,case when a.d8 = b.d8 then 1 else 0 end as d8_jp

,case when a.d9 = b.d9 then 1 else 0 end as d9_jp

,case when a.d10 = b.d10 then 1 else 0 end as d10_jp

,case when a.d20 = b.d20 then 1 else 0 end as d20_jp

,case when a.d11 = b.d11 then 1 else 0 end as d11_jp

,case when a.d12 = b.d12 then 1 else 0 end as d12_jp

,case when a.d13 = b.d13 then 1 else 0 end as d13_jp

,case when a.d14 = b.d14 then 1 else 0 end as d14_jp

,case when a.d15 = b.d15 then 1 else 0 end as d15_jp

,case when a.d16 = b.d16 then 1 else 0 end as d16_jp

,case when a.d17 = b.d17 then 1 else 0 end as d17_jp

,case when a.d18 = b.d18 then 1 else 0 end as d18_jp

,case when a.d19 = b.d19 then 1 else 0 end as d19_jp

from table a

left join table b

on a.id = b.id

) aa

where sum(d1_jp,d2_jp……,d20_jp) = 19

第八题

我们把用户对商品的评分用稀疏向量表示,保存在数据库表t里面:

  • t的字段有:uid,goods_id,star。uid是用户id
  • goodsid是商品id
  • star是用户对该商品的评分,值为1-5

现在我们想要计算向量两两之间的内积,内积在这里的语义为:

对于两个不同的用户,如果他们都对同样的一批商品打了分,那么对于这里面的每个人的分数乘起来,并对这些乘积求和。

例子,数据库表里有以下的数据:

U0 g0 2
U0 g1 4
U1 g0 3
U1 g1 1

计算后的结果为:

U0 U1 23+41=10 ……

select aa.uid1,aa.uid2

,sum(star_multi) as result

from

(

select a.uid as uid1

,b.uid as uid2

,a.goods_id

,a.star * b.star as star_multi

from t a

left join t b

on a.goods_id = b.goods_id

and a.udi<>b.uid

) aa

group by 1,2

select uid1,uid2,sum(multiply) as result

from

(select t.uid as uid1, t.uid as uid2, goods_id,a.star*star as multiply

from a left join b

on a.goods_id = goods_id

and a.uid<>uid) aa

group by goods

第九题

给出一堆数和频数的表格,统计这一堆数中位数

select a.*

,b.s_mid_n

,c.l_mid_n

,avg(b.s_mid_n,c.l_mid_n)

from

(

select

case when mod(count(*),2) = 0 then count(*)/2 else (count(*)+1)/2 end as s_mid

,case when mod(count(*),2) = 0 then count(*)/2+1 else (count(*)+1)/2 end as l_mid

from table

) a

left join

(

select id,num,row_number() over(partition by id order by num asc) nn

from table

) b

on a.s_mid = b.nn

left join

(

select id,num,row_number() over(partition by id order by num asc) nn

from table

) c

on a.l_mid = c.nn

第十题

表order有三个字段,店铺ID,订单时间,订单金额

查询一个月内每周都有销量的店铺

select distinct credit_level

from

(

select credit_level,count(distinct nn) as number

from

(

select userid,credit_level,inserttime,month(inserttime) as mm

,weekofyear(inserttime) as week

,dense_rank() over(partition by credit_level,month(inserttime) order by weekofyear(inserttime) asc) as nn

from koo.nil_temp0222

where substring(inserttime,1,7) = '2019-12'

order by credit_level ,inserttime

) aa

group by 1

) bb

where number = (select count(distinct weekofyear(inserttime))

from koo.nil_temp0222

where substring(inserttime,1,7) = '2019-12')

来源:数据仓库与Python大数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据面试之SQL面试题 的相关文章

随机推荐

  • PostgreSQL的AWR(PG_PROFILE)

    PostgreSQL参数配置 如下配置为使用pg profile最基本的配置 shared preload libraries pg stat statements pg stat statements max 10000 pg stat
  • 一个人录制课程--全网独一

    获取方式 见文末 共计八章节 1 php编程 2 web安全基础 3 中间人攻击与抓包 4 正反向代理与端口转发5 提权 6 内网 7 实战8工具 1 PHP编程 1 讲师介绍 http协议 挖掘BUG mp4 2 搭建apache php
  • 贝叶斯网络的python实现:Monty Hall问题的求解

    前两节分别介绍了贝叶斯图模型的必要性以及贝叶斯网络的基本原理 本节将通过一个简单的问题介绍贝叶斯网络的python实现 三门问题 Monty Hall problem 亦称为蒙提霍尔问题 蒙特霍问题或蒙提霍尔悖论 是电视节目中一个简单的游戏
  • Spring Bean的三种注入方式

    Spring Bean的三种注入方式 setter 方法 属性 注入 构造方法注入 注解注入 Resource和 Autowired 自动装配 Autowired 和 Resource Autowired Spring提供的注解 byTyp
  • SQL语言---视图操作

    文章目录 前言 一 视图 1 什么是视图 2 建立视图 3 删除视图 二 定义视图 1 建立视图 1 语法格式 2 举例讲解 例子1 建立房间视图 例子2 基于多表建立视图 例子3 基于视图建立视图 例子4 基于表达式的视图 2 删除视图
  • SpringBoot实现前端传入数值Controller层接收为枚举

    定义枚举 import com fasterxml jackson annotation JsonCreator import com fasterxml jackson annotation JsonFormat import lombo
  • ​第一本 Compose 图书上市,联想大咖教你学会 Android 全新 UI 编程

    朱江 现任联想 北京 有限公司 Android 开发工程师 从事 Android 开发工作多年 有丰富的项目经验 负责和参与开发过多款移动应用程序 同时还是多个开源项目的作者 2017 年开始在 CSDN 发表 Android 技术相关博文
  • VLAN技术原理和配置方法

    一 VLAN产生的背景 虚拟局域网 VLAN 是英文Virtual Local Area Network的缩写 随着网络规模不断扩大 网络中的广播报文也随之增加 结果就是使交换机的负担不停的加重 并且一些终端设备也会收到不希望收到的报文 V
  • 12306验证码分割

    首先要从12306上面将验证码爬取下来 保存到C images 下 from PIL import Image import os def get sub img im x y 截出方格图片 assert 0 lt x lt 3 asser
  • HTML+CSS3 5个炫酷的loading

    为了方便大家方便CV 每个loading对应一个html文件 文件下载压缩包 下载地址 https download csdn net download m0 48850204 20432352 spm 1001 2014 3001 550
  • 解决Glide加载图片闪烁的问题(感觉加载了两遍 !!!)

    今天由于项目需求的原因 需要把原来的ViewPager的长方形图片转成圆角图片 一直觉得Glide很强大 应该可以直接设置圆角图片 但是输入 之后并没有找到这个方法 顿时一大片问号飘过 下面来说说遇到的问题 1 之前Glide 3 0 都是
  • 层次聚类在MATLAB中实现

    层次聚类在MATLAB中实现 By Yang Liu 1 第一种方法 1 输入要聚类的数据 2 计算各个样本之间的欧氏距离 3 把距离化成矩阵 矩阵中的元素 X i j X ij Xij 表示第i个样本和第j个样
  • python深度学习之用lightgbm算法实现鸢尾花种类的分类任务实战源码

    本代码以sklearn包中自带的鸢尾花数据集为例 用lightgbm算法实现鸢尾花种类的分类任务 参考来源 https lightgbm readthedocs io en latest Python Intro html usr bin
  • 用户偏好分析

    1 量化用户偏好 首先将用户分类 设定用户对于产品 喜爱 的标准 比如一天浏览产品5次 计算不同分类用户 喜爱 不同产品的人数 例如 分类 A类用户 B类用户 产品1 10 40 产品2 40 10 用户偏好指某类用户更偏好某产品 例如表中
  • 机器学习实战笔记-01概览

    机器学习的主要挑战 1 数据问题 数据量不足 训练数据不具有代表性 需要可泛化的案例 注意采样偏差 数据质量差 错误 异常 缺失 形成了噪音 无关特征 特征工程 选取 提取 创建特征 2 算法问题 过拟合 噪音 模型过于复杂参数过多 欠拟合
  • 2023华为笔试机考题库【等和子数组的最小和/动态规划】

    题目描述 给定一个数组nums 将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 组内元素和的最小值 输入描述 第一行输入 m 接着输入m个数 表示此数组 数据范围 1 lt M lt 50 1 lt nums i lt 50
  • 2023-02-21 好用的一款十六进制编辑器软件Hex Editor Neo ,以十六进制字节形式查看文件有字节

    一 Hex Editor Neo是一款十六进制编辑器软件 可以在几秒钟内处理大文件的操作 能够帮助用户编辑ASCII 十六进制 十进制 float double和二进制数据的应用程序 感觉比notepad的hex查看功能更强大 用notep
  • 音视频开发开发核心知识+新手入门必看基础知识

    音视频开发是一个广泛的领域 它涉及到多个技术领域 包括音频编解码 视频编解码 媒体容器格式 流媒体传输 音视频处理等 以下是音视频开发的一些基础知识 音频编解码器 音频编解码器是将数字音频信号编码成一种压缩格式 并且能够解码压缩的音频数据以
  • android华为手机开启蓝牙耳机,华为手机如何连接蓝牙耳机? 华为手机连接蓝牙耳机方法教程介绍!...

    我们现在在用手机的时候经常会用到耳机 听歌接电话看视频都离不开耳机 但是有的时候如果觉得耳机插来插去很麻烦就可以尝试用蓝牙耳机 那么知道华为手机怎么连接蓝牙耳机吗 具体的连接方法是怎么样的呢 下面小编就给大家简单介绍一下具体的连接方法吧 连
  • 大数据面试之SQL面试题

    一 提要 作为一名数据工作人员 SQL是日常工作中最常用的数据提取 简单预处理语言 因为其使用的广泛性和易学程度也被其他岗位比如产品经理 研发广泛学习使用 本篇文章主要结合经典面试题 给出通过数据开发面试的SQL方法与实战 二 解题思路 简