数据分析SQL面试题实战(二)
作者:互联网
第一题:
思路:
1.找出学生表中出生年月相同的学生信息,包含学生编号,学生姓名,出生年月,学生性别。
考虑自连接,单纯通过出生年月连接,会出现重复数据,需要过滤掉重复数据,可以用学生编号去过滤掉姓名重复的数据,剩下的自己和自己重复的数据用group by过滤。
2.计算语文分数和数学分数,需要用到第二张SC表。
左连接和内连接都可以,从SC表(一维表)转成语文分数和数学分数两个新列(二维表),自然的想到case when语句。
在第一步得到的表的基础上进行计算:
第二题:
测试表:
思路:
1.计算活跃用户数,根据时间分组计数userid
2.计算出次日留存用户数,在首日活跃的情况下,之后一天活跃的用户数。使用两个表连接,在userid相等的情况下,日期加1天,对userid进行计数。
select
a.ds 日期,
count(a.userid) 活跃用户数,
count(t1.userid) 次日留存用户数
from
active_table_old a left join active_table t1
on a.userid = t1.userid
and DATEDIFF(t1.ds,a.ds) = 1
group by a.ds
3.计算次日留存率
次日留存率 = 在第一日活跃用户数中之后一日还活跃的用户数 / 第一日活跃用户数
2021年1月1日的次日留存率 = 2021年1月1日活跃的用户中在2021年1月2日还活跃的用户数 / 2021年1月1日的活跃用户数。
select
日期,
活跃用户数,
次日留存用户数 / 活跃用户数 as 次日留存率,
concat(round(100*次日留存用户数/活跃用户数,2),'%') 次日留存率百分比
from
(select
a.ds 日期,
count(a.userid) 活跃用户数,
count(t1.userid) 次日留存用户数
from
active_table a left join active_table t1
on a.userid = t1.userid
and DATEDIFF(t1.ds,a.ds) = 1
group by a.ds) t2
还是上面那个表:
思路:
1.求出满足时间范围:2021/01/01 - 2021/01/07,分组后统计活跃天数大于3天的用户id和累计活跃天数(总活跃天数)
2.计算累计活跃天数,首次活跃日期,末次活跃日期
select
userid,
count(ds)累计活跃天数,
min(ds) 首次活跃日期,
max(ds) 末次活跃日期
from
active_table
where userid in
(
select
userid
from active_table
where ds between '2021/01/01' and '2021/01/07'
group by userid
having count(ds) >= 3)
group by userid
暂时没想到第二次活跃日期要怎么一起计算出来,只想到可以用排序窗口函数做个排序列,然后取rank=2的时间,这弄成一张表然后和上面的结果进行连接得出结果。
标签:数据分析,面试题,userid,t1,活跃,2021,SQL,ds,用户数 来源: https://blog.csdn.net/weixin_43785299/article/details/117789257