HiveSQL——设计一张最近180天的注册、活跃留存表

0 问题描述

    现有一个用户活跃表user_active(user_id,active_date)、 用户注册表user_regist(user_id,regist_date),表中分区字段都为dt(yyyy-MM-dd),用户字段均为user_id; 设计一张 1-180天的注册活跃留存表;表结构如下:

1 数据分析

完整的代码如下:

selectregist_date,diff,active_user_cnt,casewhen nvl(regis_cnt, 0) != 0 then active_user_cnt / regis_cntend as retention_rate
from (selectt1.regist_date,max(t1.regist_count)                     as regis_cnt,datediff(t2.active_date, t1.regist_date) as diff,count(t2.user_id)                        as active_user_cntfrom (selectuser_id,to_date(regist_date)                                    as regist_date,count(user_id) over (partition by to_date(regist_date)) as regist_countfrom user_registwhere dt >= date_sub(current_date(), 180)) t1left join(selectuser_id,to_date(active_date) as active_datefrom user_activewhere dt >= date_sub(current_date(), 180)group by user_id, to_date(active_date)) t2on t1.user_id = t2.user_idwhere datediff(active_date, regist_date) >= 1and datediff(active_date, regist_date) <= 180group by t1.regist_date, datediff(t2.active_date, t1.regist_date)) t3
order by regist_date,diff;

上述代码解析:

步骤一:基于注册表,求出用户的注册日期regist_date、每日的用户注册数量regist_count

selectuser_id,to_date(regist_date)                                    as regist_date,count(user_id) over (partition by to_date(regist_date)) as regist_count
from user_regist
where dt >= date_sub(current_date(), 180);

步骤二:将用户注册表作为主表,关联活跃表,关联键为user_id,一对多的关系,形成笛卡尔积。需要注意:活跃用户表,每个用户每天可能会有多次活跃的情况,因此需要去重。

selectt1.regist_date,t1.user_id,t1.regist_count,t2.user_id,t2.active_date,datediff(t2.active_date, t1.regist_date) as diff
from (selectuser_id,to_date(regist_date)                                    as regist_date,count(user_id) over (partition by to_date(regist_date)) as regist_countfrom user_registwhere dt >= date_sub(current_date(), 180)) t1left join(selectuser_id,to_date(active_date) as active_datefrom user_activewhere dt >= date_sub(current_date(), 180)group by user_id, to_date(active_date)) t2on t1.user_id = t2.user_id;

步骤三:基于注册日期,留存周期分组(以“天”为单位),计算该留存周期下的活跃用户数

selectt1.regist_date,max(t1.regist_count)                     as regis_cnt,datediff(t2.active_date, t1.regist_date) as diff,count(t2.user_id)                        as active_user_cntfrom (selectuser_id,to_date(regist_date)                                    as regist_date,count(user_id) over (partition by to_date(regist_date)) as regist_countfrom user_registwhere dt >= date_sub(current_date(), 180)) t1left join(selectuser_id,to_date(active_date) as active_datefrom user_activewhere dt >= date_sub(current_date(), 180)group by user_id, to_date(active_date)) t2on t1.user_id = t2.user_id
where datediff(active_date, regist_date) >= 1and datediff(active_date, regist_date) <= 180
group by t1.regist_date, datediff(t2.active_date, t1.regist_date);

步骤四:计算留存率retention_rate

selectregist_date,diff,active_user_cnt,casewhen nvl(regis_cnt, 0) != 0 then active_user_cnt / regis_cntend as retention_rate
from (selectt1.regist_date,max(t1.regist_count)                     as regis_cnt,datediff(t2.active_date, t1.regist_date) as diff,count(t2.user_id)                        as active_user_cntfrom (selectuser_id,to_date(regist_date)                                    as regist_date,count(user_id) over (partition by to_date(regist_date)) as regist_countfrom user_registwhere dt >= date_sub(current_date(), 180)) t1left join(selectuser_id,to_date(active_date) as active_datefrom user_activewhere dt >= date_sub(current_date(), 180)group by user_id, to_date(active_date)) t2on t1.user_id = t2.user_idwhere datediff(active_date, regist_date) >= 1and datediff(active_date, regist_date) <= 180group by t1.regist_date, datediff(t2.active_date, t1.regist_date)) t3
order by regist_date,diff;

3 总结

    利用left join左表关联,笛卡尔积的形式设计最近180天的注册活跃留存表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/466670.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件包含知识点详细总结

如果想看图片和观感更好的话,可以直接去我的github或者gitbook github:https://github.com/kakaandhanhan/cybersecurity_knowledge_book-gitbook.22kaka.fun gitbook:http://22kaka.fun description: 这里将通过参考文章和做题一起进行总结,并且文件包含漏洞,很多都利用了…

基于大语言模型的AI Agents

代理&#xff08;Agent&#xff09;指能自主感知环境并采取行动实现目标的智能体。基于大语言模型&#xff08;LLM&#xff09;的 AI Agent 利用 LLM 进行记忆检索、决策推理和行动顺序选择等&#xff0c;把Agent的智能程度提升到了新的高度。LLM驱动的Agent具体是怎么做的呢&a…

JavaI/O流 File类(文件)

目录 File类实例 File类 Java的File类是java.io.File的一个类&#xff0c;它表示文件或目录的路径名。这个类在处理文件和目录时非常有用&#xff0c;它提供了很多静态方法来操作文件和目录。 以下是一些File类的常见方法&#xff1a; 构造方法&#xff1a;创建表示文件或目…

vue3 腾讯tdesign 后台管理框架的使用

1.介绍 TDesign 是具有包容性的设计体系&#xff0c;它强调为业务提供产品、服务等过程中&#xff0c;追求以人为本、人人受益的包容性&#xff0c;要求搭建过程中&#xff0c;了解业务底层&#xff0c;理解业务场景的多样性&#xff0c;并在繁杂的业务场景中寻找共性和特性&a…

【教学类-46-07】20240212立体春字1.0

背景需求&#xff1a; 在南浔古镇的非遗文化馆里看到一个新年活动折纸——立体春字&#xff0c; 我记得这个就是一个双三角结构折纸&#xff0c;完全可以用15*15的手工纸给孩子们做一套。 折纸教程 双三角折法 【“鼠”你有才】纸艺教学 剪纸——立体春字&#xff08;2月23日…

【Java EE初阶十二】网络编程TCP/IP协议(二)

1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大&#xff0c;但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类&#xff1a; 1、ServerSocket&#xff1a;给服务器使用的类&#xff0c;使用这个类来绑定端口号 2、Socket&#xf…

webpack面试解析

参考&#xff1a; 上一篇webpack相关的系列&#xff1a;webpack深入学习&#xff0c;搭建和优化react项目 爪哇教育字节面试官解析webpack-路白 1、Webpack中的module是什么&#xff1f; 通常来讲&#xff0c;一个 module 模块就是指一个文件中导出的内容&#xff0c;webpack…

Linux线程 分离和同步与互斥 条件变量

Linux线程 分离和同步与互斥 条件变量 1. 分离线程2. 线程互斥与互斥量3. 线程同步与竞态条件4. pthread库与条件变量5. 生产者-消费者 1. 分离线程 什么是线程分离&#xff1f; 线程分离是指线程在结束时&#xff0c;操作系统会自动回收其资源&#xff0c;而无需其他线程显式地…

EasyCaptcha,开源图形验证码新标杆!

引言&#xff1a; 随着互联网的普及&#xff0c;验证码已成为网站和应用程序中不可或缺的安全组件。它能够有效地防止自动化攻击、垃圾邮件和机器人活动。在众多验证码解决方案中&#xff0c;Easy-captcha以其简单易用和高度可定制的特点受到了开发者的青睐。本文将指导读者如…

leetcode:买卖股票最佳时机二

思路&#xff1a; 使用贪心算法&#xff1a;局部最优是将买卖过程中产生的正数进行相加&#xff0c;进而使得最后结果最大&#xff08;全局最优&#xff09;。 price [7,1,5,10,3,6,4] -6,4,5,-7,3,-2 正数相加就得到了最大 代码实现&#xff1a; 1.循环中下标从1开始 …

AI大模型开发架构设计(10)——AI大模型架构体系与典型应用场景

文章目录 AI大模型架构体系与典型应用场景1 AI大模型架构体系你了解多少?GPT 助手训练流程GPT 助手训练数据预处理2个训练案例分析 2 AI 大模型的典型应用场景以及应用架构剖析AI 大模型的典型应用场景AI 大模型应用架构 AI大模型架构体系与典型应用场景 1 AI大模型架构体系你…

蓝牙BLE学习-蓝牙广播

1.概念 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…