這條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