整理两道典型SQL问题回答思路

本文介绍了一种计算用户连续登录天数及留存率的方法,包括利用SQL进行数据处理的具体步骤,如去重、排序、计算连续登录日期及留存率等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源头解题思路

计算连续登录天数

1.首先查询所有用户登录天数,首先去重
Select user_id, date(login_date) as days
from tmp_login group by user_id, date(login_date);

2.row_number 计算登录时间排序
select user_id,days,row_number () over (partition by user_id order by days) as rn from(
Select user_id, date(login_date) as days
from tmp_login group by user_id, date(login_date)) t1;
3.用登录时间作差,如果得到的日期相同,那么认为是连续登录日期
select *,date_sub(days,interval rn days) as results
from
(
select user_id,days,row_number () over (partition by user_id order by days) as rn from(
Select user_id, date(login_date) as days
from tmp_login group by user_id, date(login_date))
) t2;
4.按作差结果日期分,看相同日期的个数就是连续的
select user_id, count(**) as num_days
from
(

select *, date_sub(days, interval rn day) as  results
from(
	select user_id, days, row_number() over(partition by user_id order by days) as rn
	from (
		select distinct user_id, date(login_date) as days from tmp_login) t1
) t2) t3
group by user_id,results;

2.如果要查找连续登录超过n天的用户,n为确定值,那么可以排序,看lead3 天的日期与它是否相等
select user_id,datediff(lead(days,3) over(partition by user order by days) as result from (select distinct user_id,date(login_date) as dyas from tmp_login) t1
3.找出为3天
Result=3

计算留存率
首先建立一张包含每个用户最早登入日期的表
用min()函数与 gropu by
接下来,对用户和日期去重
之后将两张表按照user_id拼接,并且计算日期差

day_diff=1/date_diff=0的为次日
三日 day_diff/date_diff=0

select first_date as dt,
concat(round(100*count(case when day_diff=1 then user_id else 0end)/count(case when day_diff=0 then user_id else 0 end),2)‘%’ ) )
(select user_name,min(date) as first_Day from userbehavior group by user_id) as t1
left join
(select user_id,date from userbehavior group by user_id, date) as t2
on t1.user_id=t2.user_id) as t3
group by first_day
order by first_Day

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值