最近工作中遇到一個需求,是根據用戶連續記錄天數來計算的,求出用戶在一段時間內最大的連續記錄時間,例如在 2016-01-01 和 2016-01-28 之間,如果用戶在3號和4號都記錄了,那么連續記錄天數為2,如果用戶在6號-10號每日都記錄了,那么最大連續記錄天數為5.
拿到這個需求的時候,說實話有點懵,第一想到的就是在代碼中去統計,會用到循環,想到那么多個用戶,并且時間跨度也有點大,比如15年到16年,兩年時間,想想就有點恐怖。
然后就把這個需求跟朋友說了,朋友也覺得有點難搞,后來通過網上一篇文章有了一些小思路。但是看得也是一知半解的,雖然經常寫 sql 語句,但也是常用的那些增刪改查,像這樣使用的方式根本沒用過,過了會,朋友又扔給我一條 sql 語句,就在該文章的基礎上進行了修改,以符合我的項目需求的語句。
SELECT *
FROM (SELECT *
FROM (
SELECT
uid,
max(days) lianxu_days,
min(login_day) start_date,
max(login_day) end_date
FROM (SELECT
uid,
@cont_day :=
(CASE
WHEN (@last_uid = uid AND DATEDIFF(created_ts, @last_dt) = 1)
THEN
(@cont_day + 1)
WHEN (@last_uid = uid AND DATEDIFF(created_ts, @last_dt) 1)
THEN
(@cont_day + 0)
ELSE
1
END) AS days,
(@cont_ix := (@cont_ix + IF(@cont_day = 1, 1, 0))) AS cont_ix,
@last_uid := uid,
@last_dt := created_ts login_day
FROM (SELECT
uid,
DATE(created_ts) created_ts
FROM plan_stage
WHERE uid != 0
ORDER BY uid, created_ts) AS t,
(SELECT
@last_uid := '',
@last_dt := '',
@cont_ix := 0,
@cont_day := 0) AS t1
) AS t2
GROUP BY uid, cont_ix
HAVING lianxu_days > 10
) tmp
ORDER BY lianxu_days DESC) ntmp
GROUP BY uid;