5个必考的大厂SQL面试题转载

原创
小哥 3年前 (2022-10-16) 阅读数 115 #大杂烩

SQL几乎每个数据帖子都是一个必要的话题,下面分享几个常见的大工厂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 num
  from
     (select user_id,date_sub(log_in_date, rank) dts
          f rom  (select user_id,log_in_date, 
                  row_number() over(partitioned by user_id order by log_in_date ) as rank
    from user_log
           )t
      )a
  group by dts
)b
where num = 7

(2) 找出连续点击三次的用户数,以及没有其他人在其间点击的用户数,

a该表记录有关点击流的信息,包括用户id 、点击时间、点击次数、点击时间

usr_id a a b a a a a

click_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 usr_id
from    
(
   select *, rank_1- rank2  as diff
   from
  (
      select *,
      row_number() over(order by click_time) as  rank_1
      row_number() over(partition by usr_id order by click_time) as rank_2
      from a
   ) b
) c
group by diff,usr_id
having count(diff) >=3

(3) 计算不包括部门最高薪资和最低薪资的平均薪资(字节跳动面试)--窗口函数

emp 表

id 员工 id ,deptno 部门编号。部门编号salary 工资

利用窗函数降序和升序分别取出最高和最低的核心值。

select 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面试)

手机中的摄像头是最受欢迎的应用之一。以下是某手机厂商数据库用户行为信息表中的部分数据截图

现在手机制造商想要对手机进行分析 应用程序(摄像头)的活动。应用程序(摄像头)处于活动状态。 需要统计以下数据。需要统计以下数据。以下统计数据是必需的。需要以下统计数据。

待获取的数据格式如下。

select d.a_t,count(distinct case when d.时间间隔=1 then d.用户id     
               else null
               end) as  第二天保留第二天保留第二天保留, 
count(distinct case when 时间间隔=1 then d.用户id
               else null
               end) /count(distinct d.用户id) as 第二天保留率第二天保留率第二天保留率,
count(distinct case when d.时间间隔=3 then d.用户id     
               else null
               end) as  3日留存数 ,
count(distinct case when 时间间隔=3 then d.用户id
               else null
               end) /count(distinct d.用户id) as 3日留存率,
count(distinct case when d.时间间隔=7 then d.用户id     
               else null
               end) as  7日留存数 ,
count(distinct case when 时间间隔=7 then d.用户id
               else null
               end) /count(distinct d.用户id) as 7日留存率

from
(select *,timestampdiff(day,a_t,b_t) as 时间间隔
from (select a.用户id,a.登陆时间 as a_t ,b.登陆时间 as b_t
from 登录信息 as a  
left join 登录信息 as b
on a.用户id=b.用户id
where a.应用名称= 相机 AND b.应用名称=相机) as c) as d
group by d.a_t;

(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_score
  FROM basketball_game_score_detail
  ORDER 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_gap
 from 
 (
  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_score
   FROM basketball_game_score_detail
   ORDER 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课程开课了,我们还会有工厂大数据大师帮你答疑解惑,包括技术、求职、面试、抓紧时间!

文章来源:华丽小海螺文章来源:华丽小海螺


这是我开发的一个小型机器人公共,目前添加了天气查询955公司名单,注意时间查询;以后还会增加图片功能和每日送书抽奖活动,以及猥亵功能,欢迎体验、拥抱。

一个机器人公共号码在线,欢迎来到猥亵

推荐阅读:
入门: 最完整的零基学习最全面的零基学习最完整的零基学习Python的问题  | 从零开始学习从零基础学习从零基础学习8个月的Python  | 实战项目 |学Python这是捷径这是捷径就是这条捷径
干货:爬行豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析最佳球员分析 |   从万众期待到口碑惨败!唐探3令人失望  | 笑新一天图龙记笑新一天图龙集 | 谜语之王回答灯谜之王灯谜之王谜语之王 |用Python人山人海素描图人山人海素描图人山人海 Dishonor太火了,我用机器学习做了一个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python日常酷跑游戏日常酷跑游戏日常酷跑游戏!
AI: 会写诗的机器人会写诗的机器人会写诗的机器人 | 给图片上色给图片上色给图片上色 | 预测收入 | 《耻辱》太火了,我用机器学习做了一部迷你推荐系统电影
小工具: Pdf转Word易于修复表单和水印!易于处理的表单和水印!易于修复表单和水印!简单的表格和水印! | 一键把html将页面另存为网页另存为网页另存为pdf!|  再见PDF提款费!提款费!提款费!提款费用! | 用90构建最强大的代码行构建最强大的代码行构建最强大的代码行PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一个固定的低成本机票提醒!制作一张别针的低价机票提醒! |60代码行做了一个语音墙纸切换,天天见女士!

年度弹出式文案年度弹出式文案

  • 1). 卧槽!Pdf转Word用Python轻松搞定 !

  • 2).学Python闻起来好香!我用100一行代码做了一个网站,帮助人们做了一行代码,做了一个网站,帮助了人们做了一行代码,帮助了人们PS旅行图片赚鸡腿吃旅行图片赚鸡腿

  • 3).第一次播放量过亿,火爆全网,我分析了《波妹》,发现了这些秘密

  • 4). 80一行行代码!使用Python让救济金做正确的事做做的人做好事的人A梦分身

  • 5).你必须掌握的东西你必须掌握20个python代码,简短而紧凑,永无止境的有用代码,简短而甜蜜,永无止境的有用的代码,简短而紧凑,永无止境的使用代码,简短而甜蜜,永无止境的用途

  • 6). 30个Python古怪技能集古怪小贴士收藏古怪技能集

  • 7). 我总结的80《菜鸟学习专页》《菜鸟学习专页》《菜鸟学习》Python精选干货.pdf》,都是干货

  • 8). 再见Python!我要学Go了!2500词深度分析词深度分析词深度分析 !

  • 9).发现一只舔狗的福利!这Python爬虫神器太酷了,不能自动下载女孩的照片

点击阅读原文点击查看点击点击阅读点击阅读原文点击查看B放我鸽子看录像!站在我的录像带上!在视频里放我鸽子!站在我的录像带上!

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除