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ō)了,朋友也覺(jué)得有點(diǎn)難搞,后來(lái)通過(guò)網(wǎng)上一篇文章有了一些小思路。但是看得也是一知半解的,雖然經(jīng)常寫(xiě) sql 語(yǔ)句,但也是常用的那些增刪改查,像這樣使用的方式根本沒(méi)用過(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ǔ)句能有所幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
通過(guò)代碼實(shí)例了解頁(yè)面置換算法原理
這篇文章主要介紹了通過(guò)代碼實(shí)例了解頁(yè)面置換算法原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08解決Node.js mysql客戶端不支持認(rèn)證協(xié)議引發(fā)的問(wèn)題
這篇文章主要介紹了解決Node.js mysql客戶端不支持認(rèn)證協(xié)議引發(fā)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06mysql 悲觀鎖與樂(lè)觀鎖的理解及應(yīng)用分析
這篇文章主要介紹了mysql 悲觀鎖與樂(lè)觀鎖的理解及應(yīng)用,結(jié)合實(shí)例形式分析了MySQL數(shù)據(jù)庫(kù)悲觀鎖與樂(lè)觀鎖相關(guān)概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-02-02mysql聚集索引、輔助索引、覆蓋索引、聯(lián)合索引的使用
本文主要介紹了mysql聚集索引、輔助索引、覆蓋索引、聯(lián)合索引的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02MySQL數(shù)據(jù)歸檔小工具mysql_archiver詳解
這篇文章主要介紹了MySQL數(shù)據(jù)歸檔小工具mysql_archiver詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12MySQL中報(bào)錯(cuò):Can’t find file: ‘./mysql/plugin.frm’的解決方法
這篇文章主要給大家介紹了關(guān)于在MySQL中報(bào)錯(cuò):Can't find file: './mysql/plugin.frm'的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11ERROR 1406 : Data too long for column 解決辦法
導(dǎo)入數(shù)據(jù)的時(shí)候,mysql報(bào)錯(cuò) ERROR 1406 : Data too long for column Data too long for column2011-04-04redhat7通過(guò)yum安裝mysql5.7.17教程
這篇文章主要為大家詳細(xì)介紹了redhat7通過(guò)yum安裝mysql5.7.17教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01