七天内连续登陆天数

一、需求描述

业务理解1:七天内最大连续登陆天数
业务理解2:七天内最近连续登陆天数(最近一天如果未登陆则连续登陆天数为0)
示例说明:七天内连续登陆天数_第1张图片

二、数据结构

流量表 tracking

字段名 字段中文名
userid 用户id
dt 分区

口径描述:userid不为空则代表登陆

三、SQL

(1)七天内最大连续登陆天数

-- 1、按照userid dt去重
-- 2、rownumber()over(partition by userid order by dt) rn
-- 3、dt - rn
-- 4、count(1) group by dt,new_dt
select
    user_id
    ,sum(login_cnt) as login_cnt -- 近7天登录次数
    ,max(login_cnt) as max_series_login_cnt -- 近7天最大连续登录天数
from
(
    select
        user_id
        ,new_dt
        ,count(1) as login_cnt -- 连续登录天数
    from
    ( -- 登录日期 - rn
        select
            user_id,dt,date_add(dt,-rn) as new_dt
        from
        ( -- 算rn
            select
                user_id,dt,row_number()over(partition by user_id order by dt) rn
            from
            ( -- 去重
                select
                    user_id
                    ,dt
                from <库名>.<表名>
                where dt between <七天前日期> and <T-1日期>
                group by user_id,dt
            ) tttt
        ) ttt
    ) tt
    group by user_id,new_dt
) t
group by user_id

(2)七天内最近连续登陆天数

-- 1、rownumber()over(partition by userid order by dt desc) rn
-- 2、当天日期 - dt + 1
-- 3、对比2和1是否相等,如果相等,给该userid dt打连续登陆标签
-- 4、筛选出连续登陆的数据,并取max(rn)
select
    user_id
    ,count(dt) as login_days -- 登录天数
    ,coalesce(max(case when is_continue = 1 then rn end),0) as continus_days -- 连续登陆天数
from
(
    select
        user_id
        ,dt
        ,if(day_diff=rn-1,1,0) as is_continue
        ,rn
    from
    ( -- rn、昨天和登录日期相差的天数
        select
            user_id
            ,dt
            ,row_number()over(partition by user_id order by dt desc) as rn
            ,datediff(<T-1日期>,dt) as day_diff
        from
        ( -- 去重
            select
                user_id
                ,dt -- 登录日期
            from <库名>.<表名>
            where dt between <七天前日期> and <T-1日期>
            group by user_id,dt
        ) aaa
    ) aa
) a
group by user_id

你可能感兴趣的:(数据仓库,数据仓库)