【SQL】查询连续登陆7天以上的用户

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 19:45   11   0

【SQL】查询连续登陆7天以上的用户

http://www.taoyouhuipin.top/

查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下我的处理方法,希望对大家有帮助。

具体思路1: 因为是要求解连续登陆的,那么如果对日期(需要先对日期distinct 去重)进行排序的话,可以知道 日期是连续递增,序号也是,例如:

date序号
2020-11-15

N

2020-11-16 /2020-11-15 +1 dayN+1
2020-11-17 /2020-11-15 +1 dayN+2
2020-11-18 /2020-11-15 +1 dayN+3
............

当我们用date - 序号天数的时候,如果存在连续登陆的日期,那么得出来的日期,应该是相同的

new_date = 2020-11-15 减去 N = 2020-11-16 减去 (N+1)= 2020-11-17 减去 (N+2)= 2020-11-18 减去 (N+3)......

我们再对new_date 分组 ,则可知道连续登陆的有多少次

select

new_date ,count(1)

from (

2020-11-15 减去 N = 2020-11-16 减去 (N+1)= 2020-11-17 减去 (N+2)= 2020-11-18 减去 (N+3)......

)

;

综上思路,我们再来理解解答题目:

with orde as (
select '2019-12-28' as date, 1 id
union all
select '2019-12-29' as date, 1 id
union all
select '2019-12-30' as date, 1 id
union all
select '2019-12-31' as date, 1 id
union all
select '2020-01-01' as date, 1 id
union all
select '2020-01-02' as date, 1 id
union all
select '2020-01-03' as date, 1 id
union all
select '2020-01-05' as date, 1 id
union all
select '2020-01-06' as date, 1 id
union all
select '2020-01-07' as date, 1 id
union all
select '2020-01-08' as date, 1 id
union all
select '2020-01-01' as date, 2 id
union all
select '2020-01-01' as date, 2 id
union all
select '2020-01-11' as date, 2 id
union all
select '2020-01-12' as date, 2 id
union all
select '2020-01-13' as date, 2 id
union all
select '2020-01-14' as date, 2 id
union all
select '2020-01-15' as date, 2 id
union all
select '2020-01-16' as date, 2 id
union all
select '2020-01-17' as date, 2 id
union all
select '2020-01-18' as date, 2 id
)
select id,count(1)
from
(
select *,date_sub(date(日期) ,interval cum day) as 结果
from (
select *,row_number() over(PARTITION by id order by 日期) as cum
from
(select DISTINCT date(date) as 日期,id from orde ) a
) b
) c
GROUP BY id,结果
having count(1)>7;

ps: 题目只是要求我们再1~30日之间计算,而上述脚本亦可计算 跨月、跨年,如果跨月跨年不算符合要求,可以根据下列逻辑计算(直接用日期 减去 数值,会有隐式数据类型转换):

with orde as (
select '2019-12-28' as date, 1 id
union all
select '2019-12-29' as date, 1 id
union all
select '2019-12-30' as date, 1 id
union all
select '2019-12-31' as date, 1 id
union all
select '2020-01-01' as date, 1 id
union all
select '2020-01-02' as date, 1 id
union all
select '2020-01-03' as date, 1 id
union all
select '2020-01-05' as date, 1 id
union all
select '2020-01-06' as date, 1 id
union all
select '2020-01-07' as date, 1 id
union all
select '2020-01-08' as date, 1 id
union all
select '2020-01-01' as date, 2 id
union all
select '2020-01-01' as date, 2 id
union all
select '2020-01-11' as date, 2 id
union all
select '2020-01-12' as date, 2 id
union all
select '2020-01-13' as date, 2 id
union all
select '2020-01-14' as date, 2 id
union all
select '2020-01-15' as date, 2 id
union all
select '2020-01-16' as date, 2 id
union all
select '2020-01-17' as date, 2 id
union all
select '2020-01-18' as date, 2 id
)
select id,count(1)
from
(
select *,date(日期) - cum as 结果
from (
select *,row_number() over(PARTITION by id order by 日期) as cum
from
(select DISTINCT date(date) as 日期,id from orde ) a
) b
) c
GROUP BY id,结果
having count(1)>=7;

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP