计算本年用户最大未登录时间段
space_user_task_statistics_log 如果用户登录过,则将信息记入该表
主要信息有用户ID和登录时间
space_user 记录用户基本信息. 主要包括用户ID和注册时间信息.
需求:
查所有用户在2017年最大的未登录时间段
如果用户在2017年才注册,那么有效时间从注册时间开始算。
其实这是一个MySQL计算连续范围的问题。
http://blog.itpub.net/29254281/viewspace-1385638/
SQL
-
select userid,startdate,enddate,diff from (
-
select t3.*,case when userid=@gid then @rn:=@rn+1 when @gid:=userid then @rn:=1 end rank
-
from (
-
select userid,dt-interval rn day c,min(dt) startdate,max(dt) enddate,
-
datediff(max(dt),min(dt)) diff
-
from (
-
select
-
cal.dt,cal.userid,case when cal.userid=@gid then @rn:=@rn+1 when @gid:=cal.userid then @rn:=1 end rn
-
from
-
(
-
select dt,userid from (
-
select '2017-01-01'+interval id-1 day dt from nums,(select @gid:=0,@rn:=0) vars where id<=dayofyear(now())
-
) var,
-
(
-
select u.userid,u.registertime from space_user u
-
where exists(select * from space_user_task_statistics_log l where l.createDate>='2017-01-01' and l.userid=u.userid)
-
) userlist
-
where dt>=date(userlist.registertime)
-
) cal
-
left join
-
(
-
select log.userid,log.createDate from
-
space_user_task_statistics_log log
-
where log.loginflag=1 and log.createDate>='2017-01-01'
-
) t1 on(t1.userid=cal.userid and cal.dt=t1.createDate)
-
where createdate is null
-
order by userid,dt
-
) t2
-
group by userid,dt-interval rn day
-
) t3
-
order by userid,diff desc
-
) t4 where rank=1
-
order by diff desc;
生产查询一次耗时10分钟左右.
diff 是最大未登录时间段的天数.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2148691/
,如需转载,请注明出处,否则将追究法律责任。