MySQL如何計(jì)算連續(xù)登錄天數(shù)
建表、insert數(shù)據(jù)
create table tmp_login ( user_id int(11) , login_date datetime ); insert into tmp_login values(2,'2020-05-29 11:12:12'); insert into tmp_login values(2,'2020-05-29 15:12:12'); insert into tmp_login values(2,'2020-05-30 11:12:12'); insert into tmp_login values(2,'2020-05-31 11:12:12'); insert into tmp_login values(2,'2020-06-01 11:12:12'); insert into tmp_login values(2,'2020-06-02 11:12:12'); insert into tmp_login values(2,'2020-06-03 11:12:12'); insert into tmp_login values(2,'2020-06-04 11:12:12'); insert into tmp_login values(2,'2020-06-05 11:12:12'); insert into tmp_login values(2,'2020-06-06 11:12:12'); insert into tmp_login values(2,'2020-06-07 11:12:12'); insert into tmp_login values(7,'2020-06-01 11:12:12'); insert into tmp_login values(7,'2020-06-02 11:12:12'); insert into tmp_login values(7,'2020-06-03 11:12:12'); insert into tmp_login values(7,'2020-06-05 11:12:12'); insert into tmp_login values(7,'2020-06-06 11:12:12'); insert into tmp_login values(7,'2020-06-07 11:12:12'); insert into tmp_login values(7,'2020-06-08 11:12:12');
方法一 row_number()
1.查詢所有用戶的每日登錄記錄
select distinct user_id, date(login_date) as days? from tmp_login;
2.row_number()計(jì)算登錄時(shí)間排序
select user_id, days, row_number() over(partition by user_id order by days) as rn from ( select distinct user_id, date(login_date) as days from tmp_login) t1;
3.用登錄時(shí)間 - row_number(),如果得到的日期相同,則認(rèn)為是連續(xù)登錄日期
select *, date_sub(days, interval rn day) as results from( select user_id, days, row_number() over(partition by user_id order by days) as rn from ( select distinct user_id, date(login_date) as days from tmp_login) t1 ) t2;
4. 按user_id、results分組就可得出連續(xù)登錄天數(shù)
select user_id, count(*) as num_days from ( select *, date_sub(days, interval rn day) as results from( select user_id, days, row_number() over(partition by user_id order by days) as rn from ( select distinct user_id, date(login_date) as days from tmp_login) t1 ) t2) t3 group by user_id , results;
直接用日期減去row_number(),不用date_sub的話,遇到登錄日期跨月時(shí)會(huì)計(jì)算錯(cuò)誤,
方法二lead() 或 lag()
這種情況適合的場(chǎng)景是,需要查找連續(xù)登錄超過n天的用戶,n為確定值
如果n為4,即計(jì)算連續(xù)登錄超過4天的用戶
-- lead計(jì)算連續(xù)登錄 select distinct user_id from( select user_id, days, datediff(lead(days, 3, '1970-01-01') over(partition by user_id order by days), days)as results from ( select distinct user_id, date(login_date) as days from tmp_login) t1) t2 where results = 3;
連續(xù)登錄4天,則日期差應(yīng)該為3。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Navicat連接linux虛擬機(jī)上的MySQL可能遇到的問題及排查方法
這篇文章主要介紹了Navicat連接linux虛擬機(jī)上的MySQL可能遇到的問題以及如何排查,本文給大家展示了問題描述及解決方法,需要的朋友可以參考下2024-02-02Mysql入門基礎(chǔ) 數(shù)據(jù)庫創(chuàng)建篇
Mysql入門基礎(chǔ) 數(shù)據(jù)庫創(chuàng)建篇,剛接觸php與mysql的朋友可以參考下。多寫多測(cè)試。2010-04-04idea中使用mysql的保姆級(jí)教程(超詳細(xì))
我們開發(fā)時(shí)經(jīng)常需要用到一些客戶端去訪問數(shù)據(jù)庫查詢、更新數(shù)據(jù)等操作,下面這篇文章主要給大家介紹了關(guān)于idea中使用mysql的保姆級(jí)教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Linux下編譯安裝Mysql 5.5的簡(jiǎn)單步驟
Linux下面因?yàn)閺腗ySQL 5.5開始使用cmake來做config了,所以編譯安裝的會(huì)和5.1版本有些區(qū)別。不過總體來說還是差別不大2015-08-08