with log as (
select
    *
    ,date_format(log_time,'%Y-%m-%d') as dt,row_number()over(partition by user_id order by log_time) as rk
from
    login_tb
where user_id in (select user_id from register_tb)
)
select user_id
from (select user_id,tmp,count(*)
from(select *,date_sub(dt,interval rk day) as tmp 
from log) a 
group by user_id,tmp
having count(*)>=3)c
order by user_id
首先就是从2表中筛选出我们需要的数据,也就是于1表进行inner join, 因为只要1表中的用户的行为数据,因为1表中是新注册的用户。 后面就是正常的处理连续登陆的思路。
我这么写比较墨迹, 更简洁一点应该这么写
,WITH log AS (
SELECT user_id,
DATE(log_time) AS login_date, -- 直接用DATE()更简洁
ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY log_time) AS rn
FROM login_tb
WHERE user_id IN (SELECT user_id FROM register_tb)
)
SELECT user_id
FROM log
GROUP BY user_id, DATE_SUB(login_date, INTERVAL rn DAY)
HAVING COUNT(*) >= 3
ORDER BY user_id;

京公网安备 11010502036488号