这条sql写了一天,百度无数,终于摸到点门路sql
需求是查询从当前日期向前推的连续登陆,好比一个用户他今天登陆了,昨天没登,连续登陆为1优化
他昨天前天都登陆了,今天没登陆,连续登陆为0.net
SELECT
user_id,
MIN(created_ymd) as start,
MAX(created_ymd) as end,
(MAX(created_ymd)-MIN(created_ymd))+1 as day_rank #最大的连续日期减去最小的日期=连续登陆天数
FROM
(
SELECT
user_id,
created_ymd,
IF (
@user_id = created_ymd ,@rn :=@rn + 1,
@rn := 1
) AS con_col,
@rwn :=@rwn + 1 AS help_col ,
@user_id := created_ymd + 1
FROM
(SELECT * from datacenter.prod_ods_useronlinetime GROUP BY user_id,created_ymd
)d, #先把数据格式优化下,去掉重复数据,由于这个表里一个用户会有多条重复数据,只是时分秒不同,主要是用来统计用户在线时长的
(SELECT
@user_id := '' ,@rn := 0 ,@rwn := 0
) a
#WHERE user_id = "0023e877e93b4723af9ffc8c4cf9c0f9" #去掉这个条件==筛选全部的用户
) c
GROUP BY
con_col - help_col
HAVING
count(1) > 1 AND MAX(created_ymd)=DATE_FORMAT(NOW(),'%Y%m%d') #max那一行是对结果数据时行筛选,最大日期是今天开始向前推;若是只须要计算连续登陆而不是最近的,去掉这个条件就好了
ORDER BY user_id
get