網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
連續(xù)活躍登陸的用戶指至少連續(xù)2天都活躍登錄的用戶
解決類(lèi)似場(chǎng)景的問(wèn)題
創(chuàng)建數(shù)據(jù)
CREATE TABLE test5active( dt string, user_id string, age int) ROW format delimited fields terminated BY ','; INSERT INTO TABLE test5active VALUES ('2019-02-11','user_1',23),('2019-02-11','user_2',19), ('2019-02-11','user_3',39),('2019-02-11','user_1',23), ('2019-02-11','user_3',39),('2019-02-11','user_1',23), ('2019-02-12','user_2',19),('2019-02-13','user_1',23), ('2019-02-15','user_2',19),('2019-02-16','user_2',19);
思路一:
1、因?yàn)槊刻煊脩舻卿洿螖?shù)可能不止一次,所以需要先將用戶每天的登錄日期去重。
2、再用row_number() over(partition by _ order by _)函數(shù)將用戶id分組,按照登陸時(shí)間進(jìn)行排序。
3、計(jì)算登錄日期減去第二步驟得到的結(jié)果值,用戶連續(xù)登陸情況下,每次相減的結(jié)果都相同。
4、按照id和日期分組并求和,篩選大于等于2的即為連續(xù)活躍登陸的用戶。
第一步:用戶登錄日期去重
select DISTINCT dt,user_id from test5active;
第二步:用row_number() over()函數(shù)計(jì)數(shù)
select t1.user_id,t1.dt, row_number() over(partition by t1.user_id order by t1.dt) day_rank from ( select DISTINCT dt,user_id from test5active )t1;
第三步:日期減去計(jì)數(shù)值得到結(jié)果
select t2.user_id,t2.dt,date_sub(t2.dt,t2.day_rank) as dis from ( select t1.user_id,t1.dt, row_number() over(partition by t1.user_id order by t1.dt) day_rank from ( select DISTINCT dt,user_id from test5active )t1)t2;
第四步:根據(jù)id和結(jié)果分組并計(jì)算總和,大于等于2的即為連續(xù)登陸的用戶,得到 用戶id,開(kāi)始日期,結(jié)束日期,連續(xù)登錄天數(shù)
select t3.user_id,min(t3.dt),max(t3.dt),count(1) from ( select t2.user_id,t2.dt,date_sub(t2.dt,t2.day_rank) as dis from ( select t1.user_id,t1.dt, row_number() over(partition by t1.user_id order by t1.dt) day_rank from ( select DISTINCT dt,user_id from test5active )t1 )t2 )t3 group by t3.user_id,t3.dis having count(1)>1;
用戶id 開(kāi)始日期 結(jié)束日期 連續(xù)登錄天數(shù)
最后:連續(xù)登陸的用戶
select distinct t4.user_id from ( select t3.user_id,min(t3.dt),max(t3.dt),count(1) from ( select t2.user_id,t2.dt,date_sub(t2.dt,t2.day_rank) as dis from ( select t1.user_id,t1.dt, row_number() over(partition by t1.user_id order by t1.dt) day_rank from ( select DISTINCT dt,user_id from test5active )t1 )t2 )t3 group by t3.user_id,t3.dis having count(1)>1 )t4;
思路二:使用lag(向后)或者lead(向前)
select user_id,t1.dt, lead(t1.dt) over(partition by user_id order by t1.dt) as last_date_id from ( select DISTINCT dt,user_id from test5active )t1;
select distinct t2.user_id from ( select user_id,t1.dt, lead(t1.dt) over(partition by user_id order by t1.dt) as last_date_id from ( select DISTINCT dt,user_id from test5active )t1 )t2 where datediff(last_date_id,t2.dt)=1;
參考:
原文鏈接:https://www.cnblogs.com/yangms/p/14179403.html
相關(guān)推薦
- 2022-11-07 pandas中字典和dataFrame的相互轉(zhuǎn)換_python
- 2022-07-09 kernel劫持modprobe?path內(nèi)容詳解_C 語(yǔ)言
- 2022-05-17 基于Python編寫(xiě)簡(jiǎn)易文字語(yǔ)音轉(zhuǎn)換器_python
- 2022-09-04 Redis分布式鎖解決秒殺超賣(mài)問(wèn)題_Redis
- 2022-11-26 使用HttpClient消費(fèi)ASP.NET?Web?API服務(wù)案例_實(shí)用技巧
- 2022-04-12 .NET 6 ‘Unable to configure HTTPS endpoint...
- 2022-06-06 visualStudioCode自動(dòng)添加、補(bǔ)全雙引號(hào)、vsc、配置
- 2022-09-12 超實(shí)用的Nginx常見(jiàn)配置合集分享_nginx
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支