mysql如何查詢兩個(gè)日期之間最大的連續(xù)登錄天數(shù)
前言
最近工作中遇到一個(gè)需求,是根據(jù)用戶連續(xù)記錄天數(shù)來(lái)計(jì)算的,求出用戶在一段時(shí)間內(nèi)最大的連續(xù)記錄時(shí)間,例如在 2016-01-01 和 2016-01-28 之間,如果用戶在3號(hào)和4號(hào)都記錄了,那么連續(xù)記錄天數(shù)為2,如果用戶在6號(hào)-10號(hào)每日都記錄了,那么最大連續(xù)記錄天數(shù)為5.
拿到這個(gè)需求的時(shí)候,說(shuō)實(shí)話有點(diǎn)懵,第一想到的就是在代碼中去統(tǒng)計(jì),會(huì)用到循環(huán),想到那么多個(gè)用戶,并且時(shí)間跨度也有點(diǎn)大,比如15年到16年,兩年時(shí)間,想想就有點(diǎn)恐怖。
解決方案
然后就把這個(gè)需求跟朋友說(shuō)了,朋友也覺得有點(diǎn)難搞,后來(lái)通過(guò)網(wǎng)上一篇文章有了一些小思路。但是看得也是一知半解的,雖然經(jīng)常寫 sql 語(yǔ)句,但也是常用的那些增刪改查,像這樣使用的方式根本沒用過(guò),過(guò)了會(huì),朋友又扔給我一條 sql 語(yǔ)句,就在該文章的基礎(chǔ)上進(jìn)行了修改,以符合我的項(xiàng)目需求的語(yǔ)句。
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;
查詢出來(lái)的結(jié)果如下圖所示:

如果要查看單個(gè)人的,那么將 sql 語(yǔ)句中的 uid !=0 改成具體的值即可。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用sql語(yǔ)句能有所幫助,如果有疑問大家可以留言交流。
相關(guān)文章
Mysql插入中文變?yōu)槿珕柼?hào)???的問題 解決方法
這篇文章介紹了Mysql插入中文變?yōu)槿珕柼?hào)???的問題 解決方法,有需要的朋友可以參考一下2013-09-09
mysql執(zhí)行sql文件報(bào)錯(cuò)Error: Unknown storage engine‘InnoDB’的解決方法
最近在執(zhí)行一個(gè)innoDB類型sql文件的時(shí)候,發(fā)現(xiàn)系統(tǒng)報(bào)錯(cuò)了,通過(guò)查找相關(guān)的資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于mysql執(zhí)行sql文件時(shí)報(bào)錯(cuò)Error: Unknown storage engine 'InnoDB'的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07
mysql8報(bào)錯(cuò):ERROR?1410?(42000):?You?are?not?allowed?to?
電腦新裝的mysql,版本為8.0以上,分配權(quán)限時(shí)直接帶密碼和賬號(hào)會(huì)報(bào)錯(cuò),這篇文章主要給大家介紹了關(guān)于mysql8報(bào)錯(cuò):ERROR?1410?(42000):?You?are?not?allowed?to?create?a?user?with?GRANT的解決辦法,需要的朋友可以參考下2022-06-06
mysqldump加-w參數(shù)備份數(shù)據(jù)時(shí)需要注意的事項(xiàng)
這篇文章主要介紹了mysqldump加-w參數(shù)備份數(shù)據(jù)時(shí)需要注意的事項(xiàng),需要的朋友可以參考下2014-06-06
mysql load data infile 的用法(40w數(shù)據(jù) 用了
測(cè)試數(shù)據(jù)的時(shí)候,生成txt文件應(yīng)該快點(diǎn),再用這種方式導(dǎo)入到mysql 速度上快點(diǎn),40w數(shù)據(jù) 用了3-5秒導(dǎo)進(jìn)mysql2013-01-01
mysql數(shù)據(jù)庫(kù)忘記管理員密碼的解決方法
我們?cè)赪indows操作系統(tǒng)下編程會(huì)使用到MySQL數(shù)據(jù)庫(kù)。但是有時(shí),我們會(huì)忘記數(shù)據(jù)庫(kù)的登錄密碼?當(dāng)我們忘記了登錄密碼,無(wú)法進(jìn)入mysql時(shí),該怎么辦呢?這里我們提供mysql的登錄秘密的修改2018-02-02
CentOS7下安裝MySQL5.7.39的詳細(xì)過(guò)程
這篇文章主要介紹了CentOS7下安裝MySQL5.7.39的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
MySQL Community Server 8.0.11安裝配置方法圖文教程
這篇文章主要為大家詳細(xì) 介紹了MySQL Community Server 8.0.11安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05

