数据分析常见SQL面试笔试题
(1)找出连续7天登陆,连续30天登陆的用户(小红书笔试,电信云面试),最大连续登陆天数的问题 --窗口函数
(2)求连续点击三次的用户数,中间不能有别人的点击 ,最大连续天数的变形问题(腾讯微保面试)–窗口函数
(3)计算除去部门最高工资,和最低工资的平均工资(字节跳动面试)–窗口函数
(4)留存的计算,和累计求和的计算 --窗口函数,自联结(pdd面试)
(5)AB球队得分流水表,得到连续三次得分的队员名字 和每次赶超对手的球员名字,(pdd面试)把这几类题型吃透,再也不怕手撕SQL和笔试了,其中最难的是题
(5),整个面试的sql基本上都是窗口函数的玩法,搭配case when 也考得比较多。
(1) 找出连续7天登陆,连续30天登陆的用户
select *
from
(select user_id ,count(1) as numfrom(select user_id,date_sub(log_in_date, rank) dtsf rom (select user_id,log_in_date, row_number() over(partitioned by user_id order by log_in_date ) as rankfrom user_log)t)agroup by dts
)b
where num = 7
(2)求连续点击三次的用户数,而且中间不能有别人的点击,a表记录了点击的流水信息,包括用户id ,和点击时间usr_id a a b a a a aclick_time t1 t2 t3 t4 t5 t6 t7 row_number() over(order by click_time) as rank_1 得到rank_1为 1 2 3 4 5 6 7 row_number() over(partition by usr_id order by click_time) 得到rank_2 为 1 2 1 3 4 5 6 rank_1- rank2 得到diff 为 0 0 2 1 1 1 1 这时我们发现只需要对diff进行分组计数大于3个就是连续点击大于三且中间没有其他人点击的用户
select distinct usrid
from
(select *, rank_1- rank2 as difffrom(select *,row_number() over(order by click_time) as rank_1row_number() over(partition by usr_id order by click_time) as rank_2from a) b
) c
group by diff,usr_id
having count(diff) >=3
(3)计算除去部门最高工资,和最低工资的平均工资(字节跳动面试)–窗口函数emp 表 id 员工 id ,deptno 部门编号,salary 工资核心是使用窗口函数降序和升序分别排一遍就取出了最高和最低。
elect a.deptno,avg(a.salary)
from (select *, rank() over( partition by deptno order by salary ) as rank_1, rank() over( partition by deptno order by salary desc) as rank_2 from emp) a
group by a.deptno
where a.rank_1 >1 and a.rank_2 >1
(4) 留存的计算,和累计求和的计算 --窗口函数,自联结(pdd面试)累计求和问题,使用sum() 窗口函数留存计算 绚丽的小海螺:SQL 计算留存率-链家面试题(5)AB球队得分流水表,得到连续三次得分的队员名字 和每次赶超对手的球员名字(pdd)在复盘时发现有类似原题,这是我在面试中遇到的最难的题问题:两支篮球队进行了激烈的篮球比赛,比分交替上升。比赛结束后,你有一张两队得分分数的明细表,记录了球队team,球员号码number,球员姓名name, 得分分数score 以及得分时间scoretime(datetime)。现在球队要对比赛中表现突出的球员做出嘉奖,所以请你用sql统计出1)连续三次(及以上)为球队得分的球员名单2)比赛中帮助各自球队反超比分的球员姓名以及对应时间。 先建一个类似的表
CREATE TABLE basketball_game_score_detail(team VARCHAR(40) NOT NULL ,number VARCHAR(100) NOT NULL,score_time datetime NOT NULL,score int NOT NULL,name varchar(100) NOT NULL
);
insert into basketball_game_score_detail values('A',1,'2020/8/28 9:01:14',1,'A1');
insert into basketball_game_score_detail values('A',5,'2020/8/28 9:02:28',1,'A5');
insert into basketball_game_score_detail values('B',4,'2020/8/28 9:03:42',3,'B4');
insert into basketball_game_score_detail values('A',4,'2020/8/28 9:04:55',3,'A4');
insert into basketball_game_score_detail values('B',1,'2020/8/28 9:06:09',3,'B1');
insert into basketball_game_score_detail values('A',3,'2020/8/28 9:07:23',3,'A3');
insert into basketball_game_score_detail values('A',4,'2020/8/28 9:08:37',3,'A4');
insert into basketball_game_score_detail values('B',1,'2020/8/28 9:09:51',2,'B1');
insert into basketball_game_score_detail values('B',2,'2020/8/28 9:11:05',2,'B2');
insert into basketball_game_score_detail values('B',4,'2020/8/28 9:12:18',1,'B4');
insert into basketball_game_score_detail values('A',1,'2020/8/28 9:13:32',2,'A1');
insert into basketball_game_score_detail values('A',1,'2020/8/28 9:14:46',1,'A1');
insert into basketball_game_score_detail values('A',4,'2020/8/28 9:16:00',1,'A4');
insert into basketball_game_score_detail values('B',3,'2020/8/28 9:17:14',3,'B3');
insert into basketball_game_score_detail values('B',2,'2020/8/28 9:18:28',3,'B2');
insert into basketball_game_score_detail values('A',2,'2020/8/28 9:19:42',3,'A2');
insert into basketball_game_score_detail values('A',1,'2020/8/28 9:20:55',1,'A1');
insert into basketball_game_score_detail values('B',3,'2020/8/28 9:22:09',2,'B3');
insert into basketball_game_score_detail values('B',3,'2020/8/28 9:23:23',3,'B3');
insert into basketball_game_score_detail values('A',5,'2020/8/28 9:24:37',2,'A5');
insert into basketball_game_score_detail values('B',1,'2020/8/28 9:25:51',3,'B1');
insert into basketball_game_score_detail values('B',2,'2020/8/28 9:27:05',1,'B2');
insert into basketball_game_score_detail values('A',3,'2020/8/28 9:28:18',1,'A3');
insert into basketball_game_score_detail values('B',4,'2020/8/28 9:29:32',1,'B4');
insert into basketball_game_score_detail values('A',1,'2020/8/28 9:30:46',3,'A1');
insert into basketball_game_score_detail values('B',1,'2020/8/28 9:32:00',1,'B1');
insert into basketball_game_score_detail values('A',4,'2020/8/28 9:33:14',2,'A4');
insert into basketball_game_score_detail values('B',1,'2020/8/28 9:34:28',1,'B1');
insert into basketball_game_score_detail values('B',5,'2020/8/28 9:35:42',2,'B5');
insert into basketball_game_score_detail values('A',1,'2020/8/28 9:36:55',1,'A1');
insert into basketball_game_score_detail values('B',1,'2020/8/28 9:38:09',3,'B1');
insert into basketball_game_score_detail values('A',1,'2020/8/28 9:39:23',3,'A1');
insert into basketball_game_score_detail values('B',2,'2020/8/28 9:40:37',3,'B2');
insert into basketball_game_score_detail values('A',3,'2020/8/28 9:41:51',3,'A3');
insert into basketball_game_score_detail values('A',1,'2020/8/28 9:43:05',2,'A1');
insert into basketball_game_score_detail values('B',3,'2020/8/28 9:44:18',3,'B3');
insert into basketball_game_score_detail values('A',5,'2020/8/28 9:45:32',2,'A5');
insert into basketball_game_score_detail values('B',5,'2020/8/28 9:46:46',3,'B5');
这里我使用了lead和lag来取每个组的前几个值,这个和最大联系天数不太一样,但也可以用类似思路去解,但是使用lead和lag做起来更容易理解
select distinct a.name ,a.team from
(
select *,lead(name,1) over(partition by team order by score_time) as ld1
,lead(name,2) over(partition by team order by score_time) as ld2
,lag(name,1) over(partition by team order by score_time) as lg1
,lag(name,2) over(partition by team order by score_time) as lg2
from table
) a
where (a.name =a.ld1 and a.name =a.ld2)
or (a.name =a.ld1 and a.name =a.lg1)
or (a.name=a.lg1 and a.name=a.lg2)
第二小问面试时没完全做出来,说了下思路,现在想了想当时的思路还是有问题,而且这个题也并不难,核心还是记录每个时刻的累计得分表
SELECT TEAM,number,name,score_time,score,case when team='A' then score else 0 end as A_score
,case when team='B' then score else 0 end B_score
FROM basketball_game_score_detail
ORDER BY SCORE_time
如下得到每个时刻的累计得分表
select team,number,name,score_time,A_score,b_score
,sum(A_score)over(order by score_time) as a_sum_score2
,sum(b_score)over(order by score_time) as b_sum_score2
from
(SELECT TEAM,number,name,score_time,score,case when team='A' then score else 0 end as A_score,case when team='B' then score else 0 end B_scoreFROM basketball_game_score_detailORDER BY SCORE_time
) as x
计算每个时刻的累计得分差,和上个时间的累计得分差,只要两个的符号相反就是反超时刻。感觉思路还是比较简洁的。
select *,score_gap*last_score_gap
from
(select *,a_sum_score2-b_sum_score2 as score_gap ,lag(a_sum_score2-b_sum_score2,1)over(order by score_time) as last_score_gapfrom (select team,number,name,score_time,A_score,b_score,sum(A_score)over(order by score_time) as a_sum_score2,sum(b_score)over(order by score_time) as b_sum_score2from (SELECT TEAM,number,name,score_time,score,case when team='A' then score else 0 end as A_score,case when team='B' then score else 0 end B_scoreFROM basketball_game_score_detailORDER BY SCORE_time) as x) as y
) as z
where z.score_gap*last_score_gap<=0
and a_sum_score2<>b_sum_score2
数据分析常见SQL面试笔试题相关推荐
- sql面试笔试题大全
(1)表名:购物信息 购物人 商品名称 数量 A 甲 2 B 乙 4 C 丙 1 A 丁 2 B 丙 5 -- 给出所有购入商品为两种或两种以上的购物人记录 答:select * from 购物信息 ...
- 【校招面经】阿里巴巴_数据分析岗_面试笔试题
(注:以下题目主要来自牛客网等论坛,解答由个人解答,可能会出现错误,并非标准答案,欢迎大家进行讨论) 1. 请说明随机森林较一般决策树稳定的几点原因 1)bagging的方法,多个树投票提高泛化能力 ...
- 100道经典Hadoop常见面试/笔试题及答案解析
100道常见Hadoop面试/笔试题,都是带有答案解析的哦,各类题型都有,单选题.多选题.判断题和简单题,这是第一版,下周推出第二版,将会加入更多面试/笔试题. 1 单选题 1.1 下面哪个程序负责 ...
- Android开发面试经——2.常见Android基础笔试题
标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报 分类: Android开发(29) 版 ...
- 最全python爬虫面试笔试题及答案汇总,三万多字,持续更新,适合新手,应届生
目录 一些经典的Python爬虫和网络编程面试题... 1 1.动态加载又对及时性要求很高怎么处理?... 1 2.分布式爬虫主要解决什么问题?... 1 3.什么是 URL?... 1 4.pyth ...
- Java 面试/笔试题神整理 [Java web and android]
Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...
- java面试笔试题大汇总
java面试笔试题大汇总 JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题 ...
- 转]C,C++经典问题,及面试笔试题
转]C,C++经典问题,及面试笔试题 1 编程基础 1.1 基本概念 1. 的理解:const char*, char const*, char*const的区别问题几乎是C++面 ...
- php mysql技术笔试题_PHP面试笔试题--选择题部分(最新整理)
<PHP面试笔试题--选择题部分(最新整理)>由会员分享,可在线阅读,更多相关<PHP面试笔试题--选择题部分(最新整理)(7页珍藏版)>请在人人文库网上搜索. 1.1. 以下 ...
最新文章
- 注意!今日起 GitHub 新建存储库的默认分支就不叫“master”了!
- tomcat,JVM内存设置
- 天梯赛 L1-025 正整数A+B (15 分)
- 【springboot】【若依(ruoyi)】@RestController 接口跨域请求
- zcmu 1128 (数据处理)
- 突发!Redis之父退出:不在维护Redis项目
- 电脑出现 远程计算机或者设备不受连接
- FPGA的Veilog HDL语法、框架总结
- UliPad 初体验----python 开发利器
- Java多线程(五) —— 线程并发库之锁机制
- css3 定义选择器
- Memcache应用场景
- iphone固件降级_手机资讯:降级必备:Phone5如何下载备份SHSH文件
- 最大尺寸分辨率_LG UltraFine 4K显示器重上架苹果商店:尺寸变大,但降为UHD
- Thinking in Java Reading Note(2.一切都是对象)
- vue.js 多页 php,vue-cli创建的项目,配置多页面的实现方法
- 没有为扩展名“.html”注册的生成提供程序
- 【数字信号处理】基于matlab GUI数字调音台【含Matlab源码 881期】
- 中国支付清算发展简史
- jquery图片轮播插件slideBox
热门文章
- bind9 dlz mysql_bind9+dlz+mysql连接断开问题
- 吉林大学计算机科学与技术专业(研)解读
- MOOS-ivp 实验三 MOOS简介(3)
- SQL Server 2005全文检索技术在网站上的应用实录
- 联调中通wincall平台-踩坑指南
- 使用Android拨打电话功能
- 魔兽争霸游戏开始前数据包分析
- AngularJS 表达式
- 阿里云Ubuntu 18.04安装图形界面
- 生命苍白无力时候遇到你,即使再难也要亲手绘出五彩生活――读《平庸的世界》有感...