php求两个日期的间隔天数怎么算_连续登陆人数天数问题

e4b914b843b198e263daa172ee73af69.png

有时候我们会碰到连续登录人数计算的问题,比如想要求下面这两个问题的结果,该怎么求?

  1. 最近连续登陆天数
  2. 任意时间段内连续登陆天数
  3. 最近连续登陆超过x天的人数

原始数据给你:

name表示用户,date表示登陆的日期

42e22ce647d5f2fc431679c82b51617d.png

最近连续登陆天数计算实现方式:

select name,count(1) as `用户最近连续登陆天数`
from (
	select name
		,date
		,first_value(date) over (partition by name order by date desc) as last_login_date		-- 用户最近登陆日期
		,DATE_ADD(
			first_value(date) over (partition by name order by date desc)											-- 用户最近登陆日期
			,INTERVAL 
				-row_number() over (partition by name order by date desc)+1 
				day
			) date_line																	-- 以用户最近登陆日期做降序排序,算出连续间隔1、2、3...n天的日期
	from aaa
) t 
where date = date_line	-- 限制 date = date_line 得到用户最近连续活跃日期
group by name               

计算过程:

1.用户最近登陆日期;

2.以用户最近登陆日期做降序排序,算出连续间隔1、2、3...n天的日期,得到一列date_line字段;

385f87fee28eaf3588437138115a8b1b.png

3.此时,如果我们限制date=date_line,就已经得到用户最近连续活跃日期了;

cf680c101a10dea649b7984650da9ac2.png

4.使用上面的结果汇总一下,"用户最近连续登陆天数"结果就出来了(通过此结果还能计算“最近连续登陆超过x天的人数”):

7cca8a0938a23203bad6b06720ea6027.png

下面这个实现方式稍微复杂一些,但不仅是能计算“最近的连续登陆天数”,还能算“任意时间段的连续登陆天数”,扩展性更强:

实现脚本:

with t as(
	select *
		,min(last_date) over (partition by name order by date desc) as date_set
	from (
		select name
			,date
			,if(DATEDIFF(lag(date) over (partition by name order by date desc),date)=1,null,date) as last_date
		from aaa
	) t 
)
select name,date_set,count(*) as `连续登陆天数`
from t 
-- where date_group='2020-10-19'	最近一天登陆用户的连续登陆天数
group by name,date_set           

计算过程:

1.把同一用户的连续登陆日期放到一块,派生出连续登陆日期组的最后日期,作为下游统计时用的分组:

b1f821d08eb73b3cee80a9769a466a16.png

2.以用户和“连续日期组”作分组汇总,得到用户在该组下面的连续登陆天数(通过此结果还能计算“某段时间内连续登陆超过x天的人数”)。

bbeb0077d48e6971e3c8068b7fdfc340.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值