MySQL面试题

练习题1:concat group_concat

用户号对应前两个不同场景,场景重复的话选择场景的第一个访问时间,场景号不足两个的输出为止输出结果示例:
在这里插入图片描述
在这里插入图片描述

create table test
(userid varchar(20),
changjing varchar(20),
inttime varchar(20)
);
insert into test values
(1,1001,1400),
(2,1002,1401),
(1,1002,1402),
(1,1001,1402),
(2,1003,1403),
(2,1004,1404),
(3,1003,1400),
(4,1004,1402),
(4,1003,1403),
(4,1001,1403),
(4,1002,1404),
(5,1002,1402),
(5,1002,1403),
(5,1001,1404),
(5,1003,1405);

————————————————
版权声明:本文为CSDN博主「Jelly-ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39669739/article/details/108324042
  1. 解答步骤
  • 关键词:每位用户,前两个不同场景
  • 注意:若场景重复,选择第一个访问时间的场景
  • 思路:找出每位用户在每个场景下的最早访问时间,对最早访问时间进行排序,以便找出前两个场景
    第一步:找出每位用户 是第一个访问时间的所有场景
select userid,changjing,min(inttime) inttime
from test
group by userid,changjing
order by userid,inttime;

第二步:对每位用户的所有场景按照时间进行排名

select *,
row_number() over(
partition by userid
order by inttime
) ranking
from(
	select userid,changjing,min(inttime) inttime
	from test
	group by userid,changjing
	order by userid,inttime) t

第三步:筛选出前两个场景

select *
from(
select *,
row_number() over(
partition by userid
order by inttime
) ranking
from(
	select userid,changjing,min(inttime) inttime
	from test
	group by userid,changjing
	order by userid,inttime) t1) t2
where ranking <=2

第四步:对用户进行分组,使用concat函数和group_concat函数得到所要求的结果形式

select concat(userid,'-',group_concat(changjing SEPARATOR '-')) result
from(
select *,
row_number() over(
partition by userid
order by inttime
) ranking
from(
	select userid,changjing,min(inttime) inttime
	from test
	group by userid,changjing
	order by userid,inttime) t1) t2
where ranking <=2
group by userid;

练习题2:次日、三日、七日留存

相机是深受大家喜爱的应用之一,现在我们需要研究相机的活跃情况,需统计如下数据:某日活跃的用户(uid)在后续的一周内的留存情况(计算次留、三留、七留)
指标定义:

  • 某日活跃用户数:某日活跃的去重用户数;
  • N日留存用户数:某日活跃的用户数在之后的第N日活跃用户数;
  • N日活跃留存率:N日留存用户数/某日活跃用户数
    例:20180501日去重用户数10000,这批用户20180503日仍有7000人活跃,则3日活跃留存率为7000/10000=70%。
    在这里插入图片描述
    第一步:计算活跃度
select dayno,count(distinct uid) '活跃度'
from aui
where app_name = '相机'
group by dayno;

第二步:次日留存
(两表自交,利用case when找到符合相差日期为1天的id,计数,得出次日留存人数,最后用distinct去重)

select a.day1,
count(distinct case when day2-day1=1 then a.uid end) '次留'
from
(select uid,date_format(dayno,'%Y%m%d'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值