Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >留存专题-1~180日留存数仓设计

留存专题-1~180日留存数仓设计

作者头像
数据仓库晨曦
发布于 2024-12-19 07:46:07
发布于 2024-12-19 07:46:07
16300
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

计算1~180天留存率数据仓库设计方案。在实际业务场景中可能是计算 1、3、7、14、30、60、90、180日留存这种方式,也可能是1~180连续每天都要计算,当然极端情况下也会有1~360日留存的计算。主要讲述建设思路。文章以1~7日数据进行计算了展示,计算180日留存时需要调整数据周期。

一、数据处理

把生成的数据作为ods层数据,进行基础的数据清洗和加工。

新增用户表: 加工为用户维表或者是用户快照表。在实际业务场景中,通常建设为用户快照表,每天一份全量快照。

用户登录表: 在实际应用场景中,原始数据为用户的所有登录日志(或者是所有操作日志记录)。在dwd层,按照用户登录日期分区,包含用户当天的全量操作记录。在dws层按天进行分区,按照用户进行去重处理,每个活跃用户每天一条记录。(实际应用中一定要处理,减少计算留存数据的复杂度和计算量。给出的样例数据没有重复记录,不需要dwd层明细数据存储了,所以直接给出dws层的按日分区的表。

表结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--新增用户表
create table t_dim_user_create
(
    user_id      string,
    create_date  string
) COMMENT '新增用户表'
partitioned by (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
-- 用户登录表
create table t_dws_user_login
(
    user_id     string
) COMMENT '用户登录表'
partitioned by (login_date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

ETL流程

我们给出的数据无需太多处理,主要将原始数据进行分区。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--新增用户表数据插入(这里创建628日分区数据,628日是我们创建的用户的最后一天)
insert overwrite table t_dim_user_create partition(dt = '2024-06-28')
select user_id,create_date
from t_user_create
where create_date <= '2024-06-28';

--用户登录表
insert overwrite table t_dws_user_login partition(login_date)
select user_id,login_date
from t_user_login;

样例数据-用户登录表的分区数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show partitions t_dws_user_login;
+------------------------+
|       partition        |
+------------------------+
| login_date=2024-01-01  |
| login_date=2024-01-02  |
| login_date=2024-01-03  |
| login_date=2024-01-04  |
| login_date=2024-01-05  |
| login_date=2024-01-06  |
| login_date=2024-01-07  |
| login_date=2024-01-08  |
| login_date=2024-01-09  |
| login_date=2024-01-10  |
……

以上就是基础数据的处理,着重将数据进行了分区处理,使其更加符合实际场景中的分区。

方案一:横表处理-直接计算

直接进行计算,产出对应的留存率数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select create_date,
       sum(r1) / count(distinct user_id) as r1_rate,
       sum(r2) / count(distinct user_id) as r2_rate,
       sum(r3) / count(distinct user_id) as r3_rate,
       sum(r4) / count(distinct user_id) as r4_rate,
       sum(r5) / count(distinct user_id) as r5_rate,
       sum(r6) / count(distinct user_id) as r6_rate,
       sum(r7) / count(distinct user_id) as r7_rate
from (select t_create.user_id,
             t_create.create_date,
             t_login.login_date,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 1 then 1 else 0 end as r1,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 2 then 1 else 0 end as r2,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 3 then 1 else 0 end as r3,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 4 then 1 else 0 end as r4,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 5 then 1 else 0 end as r5,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 6 then 1 else 0 end as r6,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 7 then 1 else 0 end as r7
      from (select user_id,
                   create_date
            from t_dim_user_create
            where dt = '2024-06-28'
              and create_date < '2024-06-28'
              and create_date >= date_add('2024-06-28', -7)) t_create
               left join
           (select user_id,
                   login_date
            from t_dws_user_login) t_login
           on t_create.user_id = t_login.user_id
      where to_date(t_login.login_date) > to_date(t_create.create_date)
        and t_login.login_date > date_add('2024-06-28', -7)
        and t_login.login_date <= '2024-06-28') tt
group by create_date
order by create_date asc

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+----------+----------+----------+----------+----------+----------+----------+
| create_date  | r1_rate  | r2_rate  | r3_rate  | r4_rate  | r5_rate  | r6_rate  | r7_rate  |
+--------------+----------+----------+----------+----------+----------+----------+----------+
| 2024-06-21   | 1.0      | 1.0      | 0.8      | 0.8      | 1.0      | 0.8      | 0.6      |
| 2024-06-22   | 0.8      | 1.0      | 0.8      | 0.9      | 0.9      | 0.9      | 0.0      |
| 2024-06-23   | 1.0      | 0.9      | 0.9      | 0.7      | 1.0      | 0.0      | 0.0      |
| 2024-06-24   | 1.0      | 1.0      | 0.9      | 0.7      | 0.0      | 0.0      | 0.0      |
| 2024-06-25   | 1.0      | 0.9      | 0.9      | 0.0      | 0.0      | 0.0      | 0.0      |
| 2024-06-26   | 0.9      | 0.7      | 0.0      | 0.0      | 0.0      | 0.0      | 0.0      |
| 2024-06-27   | 1.0      | 0.0      | 0.0      | 0.0      | 0.0      | 0.0      | 0.0      |
+--------------+----------+----------+----------+----------+----------+----------+----------+

方案二:先竖表再横表-根据创建日期分区

先以竖表的方式建设DM层,其中DM层以create_date作为分区字段 建表语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table t_dm_user_retention1
(
    retention_days   bigint COMMENT '留存天数',
    retention_rate   double COMMENT '留存率'
) COMMENT '用户留存率1'
partitioned by (create_date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

数据插入语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert overwrite table t_dm_user_retention1 partition (create_date)
select retention_days,
             login_cnt / create_date_cnt as retention_reate,
             create_date
      from (select t_create.create_date,
                   create_date_cnt,
                   datediff(to_date(t_login.login_date), to_date(t_create.create_date)) as retention_days,
                   count(1)                                                             as login_cnt
            from (select user_id,
                         create_date,
                         count(user_id) over (partition by create_date) as create_date_cnt
                  from t_dim_user_create
                  where dt= '2024-06-28' --限定数据分区
                  and create_date >= date_add('2024-06-28',-7)
                  and create_date <= '2024-06-28' --进行数据行裁剪
                      ) t_create
                     left join
                 (select user_id,
                         login_date
                  from t_dws_user_login
                  where login_date > date_add('2024-06-28',-7)
                  and login_date <= '2024-06-28' --重点关注该部分使用的数据分区数量
                  ) t_login
                 on t_create.user_id = t_login.user_id
            where to_date(t_login.login_date) > to_date(t_create.create_date)
            group by t_create.create_date, create_date_cnt, retention_days) t

样例数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from t_dm_user_retention1 where create_date = '2024-06-21' order by retention_days asc;
+-----------------+-----------------+--------------+
| retention_days  | retention_rate  | create_date  |
+-----------------+-----------------+--------------+
| 1               | 1.0             | 2024-06-21   |
| 2               | 1.0             | 2024-06-21   |
| 3               | 0.8             | 2024-06-21   |
| 4               | 0.8             | 2024-06-21   |
| 5               | 1.0             | 2024-06-21   |
| 6               | 0.8             | 2024-06-21   |
| 7               | 0.6             | 2024-06-21   |
+-----------------+-----------------+--------------+

查询最后留存数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *
from t_dm_user_retention1 pivot (
        sum(retention_rate) as rate
        for retention_days in(1 as 1_day,2 as 2_day,3 as 3_day,4 as 4_day,5 as 5_day,6 as 6_day,7 as 7_day)
        )
where create_date >= '2024-06-21'
order by 1 asc

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+--------+--------+--------+--------+--------+--------+--------+
| create_date  | 1_day  | 2_day  | 3_day  | 4_day  | 5_day  | 6_day  | 7_day  |
+--------------+--------+--------+--------+--------+--------+--------+--------+
| 2024-06-21   | 1.0    | 1.0    | 0.8    | 0.8    | 1.0    | 0.8    | 0.6    |
| 2024-06-22   | 0.8    | 1.0    | 0.8    | 0.9    | 0.9    | 0.9    | NULL   |
| 2024-06-23   | 1.0    | 0.9    | 0.9    | 0.7    | 1.0    | NULL   | NULL   |
| 2024-06-24   | 1.0    | 1.0    | 0.9    | 0.7    | NULL   | NULL   | NULL   |
| 2024-06-25   | 1.0    | 0.9    | 0.9    | NULL   | NULL   | NULL   | NULL   |
| 2024-06-26   | 0.9    | 0.7    | NULL   | NULL   | NULL   | NULL   | NULL   |
| 2024-06-27   | 1.0    | NULL   | NULL   | NULL   | NULL   | NULL   | NULL   |
+--------------+--------+--------+--------+--------+--------+--------+--------+

方案三:先竖表再横表,以登陆日期作为竖表分区结果

根据登陆日期作为分区,字段包含新增日期、留存天数、留存率和用户登陆日期。 建表语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table t_dm_user_retention2
(
    create_date      string COMMENT '新增日期',
    retention_days   bigint COMMENT '留存天数',
    retention_rate   double COMMENT '留存率'
) COMMENT '用户留存率2'
partitioned by (login_date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

数据插入语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--2024-06-28日数据处理
insert overwrite table t_dm_user_retention2 partition (login_date)
select create_date,
       retention_days,
       login_cnt / create_date_cnt as retention_reate,
       login_date
from (select t_create.create_date,
             t_login.login_date,
             create_date_cnt,
             datediff(to_date(t_login.login_date), to_date(t_create.create_date)) as retention_days,
             count(1)                                                             as login_cnt
      from (select user_id,
                   create_date,
                   count(user_id) over (partition by create_date) as create_date_cnt
            from t_dim_user_create
            where dt = '2024-06-28' --限定数据分区
              and create_date >= date_add('2024-06-28', -7)
              and create_date <= '2024-06-28' --进行数据行裁剪
           ) t_create
               left join
           (select user_id,
                   login_date
            from t_dws_user_login
            where login_date = '2024-06-28' --重点关注该部分使用的数据分区数量
           ) t_login
           on t_create.user_id = t_login.user_id
      where to_date(t_login.login_date) > to_date(t_create.create_date)
      group by t_create.create_date, t_login.login_date, create_date_cnt, retention_days) t

为了能有2024-06-21日之后的所有留存数据,需要对前面7天的数据进行刷新。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--2024-06-27日数据处理
insert overwrite table t_dm_user_retention2 partition (login_date)
select create_date,
       retention_days,
       login_cnt / create_date_cnt as retention_reate,
       login_date
from (select t_create.create_date,
             t_login.login_date,
             create_date_cnt,
             datediff(to_date(t_login.login_date), to_date(t_create.create_date)) as retention_days,
             count(1)                                                             as login_cnt
      from (select user_id,
                   create_date,
                   count(user_id) over (partition by create_date) as create_date_cnt
            from t_dim_user_create
            where dt = '2024-06-27' --限定数据分区
              and create_date >= date_add('2024-06-27', -7)
              and create_date <= '2024-06-27' --进行数据行裁剪
           ) t_create
               left join
           (select user_id,
                   login_date
            from t_dws_user_login
            where login_date = '2024-06-27' --重点关注该部分使用的数据分区数量
           ) t_login
           on t_create.user_id = t_login.user_id
      where to_date(t_login.login_date) > to_date(t_create.create_date)
      group by t_create.create_date, t_login.login_date, create_date_cnt, retention_days) t

样例数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+-----------------+-----------------+-------------+
| create_date  | retention_days  | retention_rate  | login_date  |
+--------------+-----------------+-----------------+-------------+
| 2024-06-14   | 7               | 0.7             | 2024-06-21  |
| 2024-06-15   | 6               | 0.8             | 2024-06-21  |
| 2024-06-16   | 5               | 0.5             | 2024-06-21  |
| 2024-06-17   | 4               | 0.9             | 2024-06-21  |
| 2024-06-18   | 3               | 0.8             | 2024-06-21  |
| 2024-06-19   | 2               | 0.9             | 2024-06-21  |
| 2024-06-20   | 1               | 0.8             | 2024-06-21  |
| 2024-06-15   | 7               | 0.8             | 2024-06-22  |
| 2024-06-16   | 6               | 0.6             | 2024-06-22  |
| 2024-06-17   | 5               | 1.0             | 2024-06-22  |
| 2024-06-18   | 4               | 0.8             | 2024-06-22  |
| 2024-06-19   | 3               | 1.0             | 2024-06-22  |
| 2024-06-20   | 2               | 1.0             | 2024-06-22  |
| 2024-06-21   | 1               | 1.0             | 2024-06-22  |
| 2024-06-16   | 7               | 0.8             | 2024-06-23  |
| 2024-06-17   | 6               | 0.8             | 2024-06-23  |
| 2024-06-18   | 5               | 0.9             | 2024-06-23  |
| 2024-06-19   | 4               | 1.0             | 2024-06-23  |
| 2024-06-20   | 3               | 0.7             | 2024-06-23  |
| 2024-06-21   | 2               | 1.0             | 2024-06-23  |
| 2024-06-22   | 1               | 0.8             | 2024-06-23  |
| 2024-06-17   | 7               | 0.8             | 2024-06-24  |
| 2024-06-18   | 6               | 0.9             | 2024-06-24  |
| 2024-06-19   | 5               | 1.0             | 2024-06-24  |
| 2024-06-20   | 4               | 0.7             | 2024-06-24  |
| 2024-06-21   | 3               | 0.8             | 2024-06-24  |
| 2024-06-22   | 2               | 1.0             | 2024-06-24  |
| 2024-06-23   | 1               | 1.0             | 2024-06-24  |
| 2024-06-18   | 7               | 0.7             | 2024-06-25  |
| 2024-06-19   | 6               | 0.7             | 2024-06-25  |
| 2024-06-20   | 5               | 0.5             | 2024-06-25  |
| 2024-06-21   | 4               | 0.8             | 2024-06-25  |
| 2024-06-22   | 3               | 0.8             | 2024-06-25  |
| 2024-06-23   | 2               | 0.9             | 2024-06-25  |
| 2024-06-24   | 1               | 1.0             | 2024-06-25  |
| 2024-06-19   | 7               | 0.9             | 2024-06-26  |
| 2024-06-20   | 6               | 0.6             | 2024-06-26  |
| 2024-06-21   | 5               | 1.0             | 2024-06-26  |
| 2024-06-22   | 4               | 0.9             | 2024-06-26  |
| 2024-06-23   | 3               | 0.9             | 2024-06-26  |
| 2024-06-24   | 2               | 1.0             | 2024-06-26  |
| 2024-06-25   | 1               | 1.0             | 2024-06-26  |
| 2024-06-20   | 7               | 0.8             | 2024-06-27  |
| 2024-06-21   | 6               | 0.8             | 2024-06-27  |
| 2024-06-22   | 5               | 0.9             | 2024-06-27  |
| 2024-06-23   | 4               | 0.7             | 2024-06-27  |
| 2024-06-24   | 3               | 0.9             | 2024-06-27  |
| 2024-06-25   | 2               | 0.9             | 2024-06-27  |
| 2024-06-26   | 1               | 0.9             | 2024-06-27  |
| 2024-06-21   | 7               | 0.6             | 2024-06-28  |
| 2024-06-22   | 6               | 0.9             | 2024-06-28  |
| 2024-06-23   | 5               | 1.0             | 2024-06-28  |
| 2024-06-24   | 4               | 0.7             | 2024-06-28  |
| 2024-06-25   | 3               | 0.9             | 2024-06-28  |
| 2024-06-26   | 2               | 0.7             | 2024-06-28  |
| 2024-06-27   | 1               | 1.0             | 2024-06-28  |
+--------------+-----------------+-----------------+-------------+

查询结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *
from (select create_date, retention_days, retention_rate
      from t_dm_user_retention2
      where login_date > '2024-06-21'
        and create_date >= '2024-06-21') t pivot (
        sum(retention_rate) as rate
        for retention_days in(1 as 1_day,2 as 2_day,3 as 3_day,4 as 4_day,5 as 5_day,6 as 6_day,7 as 7_day)
        )

order by 1 asc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+--------+--------+--------+--------+--------+--------+--------+
| create_date  | 1_day  | 2_day  | 3_day  | 4_day  | 5_day  | 6_day  | 7_day  |
+--------------+--------+--------+--------+--------+--------+--------+--------+
| 2024-06-21   | 1.0    | 1.0    | 0.8    | 0.8    | 1.0    | 0.8    | 0.6    |
| 2024-06-22   | 0.8    | 1.0    | 0.8    | 0.9    | 0.9    | 0.9    | NULL   |
| 2024-06-23   | 1.0    | 0.9    | 0.9    | 0.7    | 1.0    | NULL   | NULL   |
| 2024-06-24   | 1.0    | 1.0    | 0.9    | 0.7    | NULL   | NULL   | NULL   |
| 2024-06-25   | 1.0    | 0.9    | 0.9    | NULL   | NULL   | NULL   | NULL   |
| 2024-06-26   | 0.9    | 0.7    | NULL   | NULL   | NULL   | NULL   | NULL   |
| 2024-06-27   | 1.0    | NULL   | NULL   | NULL   | NULL   | NULL   | NULL   |
+--------------+--------+--------+--------+--------+--------+--------+--------+

方案对比

我们需要思考和对比集中方式在日常每天调度中的计算量对应程序的复杂度。

  • 1.写SQL或者说SQL可读性上讲,方案一和方案二、方案三并无太大差别。方案一更加直接,但是需要写较多的重复逻辑,较多的case when 。竖表则更加简洁,但是需要进一步行转列,尤其明确需要横表展示的情况下。
  • 2.方案一和方案二每天调度计算最新日期的留存时,所需要的登陆日志数据均为留存周期内的所有日志数据。即1~7日留存则需要7天的登陆日志,1~180天留存则需要180天的登陆日志。方案三则仅需要1天的登陆日志。(注意:这里是整个方案的核心,节约计算量关键所在)
  • 3.查询数据的时候,方案二对比方案三相对简单,方案三需要先限定数据分区,然后在查询分区内的创建日期,逻辑相对较绕一些,对外交付使用时沟通成本变高,建议转换为横表之后交付。
  • 总结:在数据量较大、并且需要计算较长留存周期,建议使用方案三,对下游交付行转列之后的横表结果,便于与下游沟通。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
留存专题-计算1~7日留存率
我们使用留存专题-基础数据生成数据,计算2024-01-01日~2024-01-07日新增用户的1日、2日、3日、4日、5日、6日、7日留存率
数据仓库晨曦
2024/12/19
1230
留存专题-计算1~7日留存率
留存专题-基础数据生成
为完成留存数据,我们需要先准备相关数据,包含三份数据:日期维表、新增用户表、用户登录表。生成数据涉及不少知识点,之前基本都写过了,这里不再赘述。涉及函数如下。 space() split() posexplode() random() datediff() pow()
数据仓库晨曦
2024/12/19
1010
留存专题-基础数据生成
SQL题目
2、   • 当签到天数%7=3 则领取3金币   • 当签到天数%7=0 则领取7金币   • 其余情况,领取1金币
挽风
2023/10/17
3230
常见大数据面试SQL-近30天连续登陆3天以上次数-非开窗
有用户登录记录,已经按照日期去重。求近三十天,用户连续登录超过3天的次数,一直连续登录算一次,有间隔然后重新计算次数, 要求不能用开窗
数据仓库晨曦
2024/08/27
2230
常见大数据面试SQL-近30天连续登陆3天以上次数-非开窗
大数据 面试 SQL 040 计算次日留存率
现有用户登录记录表,已经按照用户日期进行去重处理。以用户登录的最早日期作为新增日期,请计算次日留存率是多少。
数据仓库晨曦
2024/01/08
7180
大数据 面试 SQL 040 计算次日留存率
这些留存分析的计算方式,你知道吗(6)
在极易同质化的今天,流量竞争着实激烈,提高用户留存的重要性不言而喻,且存量用户的获客成本远远低于拉新成本。
万能数据的小草
2024/07/23
2340
这些留存分析的计算方式,你知道吗(6)
常见大数据面试SQL-各用户最长的连续登录天数-可间断
现有各用户的登录记录表t_login_events如下,表中每行数据表达的信息是一个用户何时登录了平台。现要求统计各用户最长的连续登录天数,间断一天也算作连续,例如:一个用户在1,3,5,6登录,则视为连续6天登录。
数据仓库晨曦
2024/07/12
5710
常见大数据面试SQL-各用户最长的连续登录天数-可间断
用SQL进行用户留存率计算
所谓留存,就是指某日创建的账号在后续自然日登录的比例,比如3月1日新增账号创建数为100,在3月2日这部分用户登录数为51,那么3月1日新增用户的次日留存率为51/100=51%。
可以叫我才哥
2022/04/12
1.5K0
用SQL进行用户留存率计算
数仓用户行为漏斗分析如何SQL实现(第二节)
如果不考虑2019-02-11和2019-02-12的新增用户:2019-02-10新增100人,一天后它的留存率是30%,2天12号它的留存率是25%,3天后留存率32%;
小晨说数据
2022/03/09
1.1K0
数仓用户行为漏斗分析如何SQL实现(第二节)
干货 | 如何用SQL做留存率分析
无论是产品经理、产品运营还是数据分析师,在评估一个产品的用户使用情况时肯定离不开留存率、忠诚度等观测指标。这些指标可以反映用户对于产品的粘性、产品用户价值质量的高低,及时了解用户留存、流失趋势,有助于帮助产品做更好的功能迭代,也有助于运营及时进程运营策略的调整,比如:当新用户留存率低的时候,是不是需要调整新用户的活动策略,或者当老用户留存率低的时候,是不是某个产品功能的问题,或者活动对老用户不友好而导致流失等等……
CDA数据分析师
2021/09/28
5K0
留存和流失指标
关注产品对应用户的黏性,评判APP初期能否留下用户,以及活跃用户规模增长的情况,尤其在在AARRR模型,留存被单独说明为一个用户运营数据指标。
平常心
2021/11/25
1.3K0
大数据面试SQL038 用户连续登录所有断点日期(二)
038题目发出后,群里很多朋友发出各种疑问,也给出了很多写法。大家的疑问主要有两个
数据仓库晨曦
2024/01/08
3072
大数据面试SQL038 用户连续登录所有断点日期(二)
如何用SQL实现用户行为漏斗分析
1 每日活跃设备明细 dwd_start_log--->dws_uv_detail_day
大数据学习与分享
2022/05/19
2.3K0
如何用SQL实现用户行为漏斗分析
大数据 面试SQL 038 用户连续登录的所有断点日期
现有用户登录记录表,已经按照用户日期进行去重处理。请查询出用户连续登录中出现断点的所有日期
数据仓库晨曦
2024/01/08
2530
大数据 面试SQL 038 用户连续登录的所有断点日期
SQL总结大厂真题-连续登录超过N天用户(一)
现有用户登录日志表 t_login_log,包含用户ID(user_id),登录日期(login_date)。数据已经按照用户日期去重,请查出连续登录超过4天的用户ID
数据仓库晨曦
2024/01/08
6860
SQL总结大厂真题-连续登录超过N天用户(一)
「求职」7道数据分析面试题,涵盖80%常考知识点『SQL篇』
解决痛点:本文为招聘过程中总结的7道SQL面试题,涵盖常考知识点,对于准备找工作的你会有很大帮助。
小火龙说数据
2022/06/30
6060
「求职」7道数据分析面试题,涵盖80%常考知识点『SQL篇』
腾讯大数据面试SQL-连续登陆超过N天的用户
现有用户登录日志表 t_login_log,包含用户ID(user_id),登录日期(login_date)。数据已经按照用户日期去重,请查出连续登录超过4天的用户ID
数据仓库晨曦
2024/06/27
1660
腾讯大数据面试SQL-连续登陆超过N天的用户
12000字!实战案例!Python+SQL京东用户行为分析
项目对京东电商运营数据集进行指标分析以了解用户购物行为特征,为运营决策提供支持建议。本文采用了MySQL和Python两种代码进行指标计算以适应不同的数据分析开发环境。
用户6888863
2023/03/01
2.1K3
12000字!实战案例!Python+SQL京东用户行为分析
MySQL——SQL练习题
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100174.html原文链接:
全栈程序员站长
2021/05/21
9250
MySQL——SQL练习题
数据分析编程:SQL,Python or SPL?
10 分钟没有任何动作或退出后 5 分钟没有登录则认为会话结束,计算各用户的会话次数。
朱迪
2024/11/12
730
推荐阅读
相关推荐
留存专题-计算1~7日留存率
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验