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

2024-02-06 18:12

本文主要是介绍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天的注册活跃留存表。

这篇关于HiveSQL——设计一张最近180天的注册、活跃留存表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/685134

相关文章

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系