第一题:
思路:
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的时间,这弄成一张表然后和上面的结果进行连接得出结果。