数据分析SQL面试题实战(二)

第一题:
数据分析SQL面试题实战(二)
思路:
1.找出学生表中出生年月相同的学生信息,包含学生编号,学生姓名,出生年月,学生性别。
考虑自连接,单纯通过出生年月连接,会出现重复数据,需要过滤掉重复数据,可以用学生编号去过滤掉姓名重复的数据,剩下的自己和自己重复的数据用group by过滤。
数据分析SQL面试题实战(二)

2.计算语文分数和数学分数,需要用到第二张SC表。
左连接和内连接都可以,从SC表(一维表)转成语文分数和数学分数两个新列(二维表),自然的想到case when语句。

在第一步得到的表的基础上进行计算:
数据分析SQL面试题实战(二)
第二题:
数据分析SQL面试题实战(二)
测试表:
数据分析SQL面试题实战(二)

思路:
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

数据分析SQL面试题实战(二)
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

数据分析SQL面试题实战(二)
还是上面那个表:

数据分析SQL面试题实战(二)
思路:
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

数据分析SQL面试题实战(二)

暂时没想到第二次活跃日期要怎么一起计算出来,只想到可以用排序窗口函数做个排序列,然后取rank=2的时间,这弄成一张表然后和上面的结果进行连接得出结果。

上一篇:MyBatis返回值用 BaseResultMap


下一篇:SpringBoot + WebSocket 实现答题对战匹配机制