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.mzph.cn/news/681029.shtml

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

相关文章

ctfshow-php特性(web102-web115)

目录 web102 web103 web104 web105 web106 web107 web108 web109 web110 web111 web112 web113 web114 web115 实践是检验真理的 要多多尝试 web102 <?php highlight_file(__FILE__); $v1$_POST[V1]; $v2$_GET[v2]; $v3$_GET[v3]; $v4is_numeric($v2)and is…

controller-manager学习三部曲之二:源码学习

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 作为《controller-manager学习三部曲》系列的第二篇&#xff0c;前面通过shell脚本找到了程序的入口&#xff0c;接下来咱们来学习controller-mana…

c入门第十一篇——物以类聚(数组)

我&#xff1a;“师弟&#xff0c;看你在发呆&#xff0c;怎么了&#xff1f;” 师弟&#xff1a;“师兄&#xff0c;我喜欢的那个女生给我出了一道题。题目是输入班上学生的成绩&#xff0c;并对学生成绩排序&#xff0c;我在想怎么做。” 我&#xff1a;“哦&#xff1f;这个…

一文彻底搞懂布隆过滤器

文章目录 1. 基本原理2. 布隆过滤器的优点3. 布隆过滤器的缺点4. 布隆过滤器的应用场景 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间高效的概率数据结构&#xff0c;用于判断一个元素是否在一个集合中。它使用位数组和一系列哈希函数来实现。 1. 基本原理 首先…

IP和ARP相关问题

1.IP协议的作用&#xff1f; IP协议属于网络层的协议&#xff0c;主要作用是定义数据包的格式&#xff0c;对数据包进行路由和寻址&#xff0c;以便它们可以跨网络传播并到达正确的目的地。目前的IP协议分为两种&#xff0c;分为IPv4和IPv6。 2.IPv4和IPv6的区别&#xff1f;…

综合例题及补充

目录 查询员工的编号、姓名、雇佣日期&#xff0c;以及计算出每一位员工到今天为止被雇佣的年数、月数、天数 计算出年 计算月 计算天数 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 查询员工的编号、姓名、雇佣日期&#xff0c…

项目排期 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 项目组共有N个开发人员&#xff0c;项目经理接到了M个独立的需求&#xff0c;每个需求的工作量不同&#xff0c;且每个需求只能由一个开发人员独立完成&#xff0…

Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)

文章目录 题面链接题意题解代码总结 题面 链接 C. Kefa and Park 题意 求叶节点数量&#xff0c;叶节点满足&#xff0c;从根节点到叶节点的路径上最长连续1的长度小于m 题解 这道题目主要是实现&#xff0c;当不满足条件时直接返回。 到达叶节点后统计答案&#xff0c;用…

机器学习:卷积介绍及代码实现卷积操作

传统卷积运算是将卷积核以滑动窗口的方式在输入图上滑动&#xff0c;当前窗口内对应元素相乘然后求和得到结果&#xff0c;一个窗口一个结果。相乘然后求和恰好也是向量内积的计算方式&#xff0c;所以可以将每个窗口内的元素拉成向量&#xff0c;通过向量内积进行运算&#xf…

游泳耳机怎么选?四大口碑最好游泳耳机推荐

在挑选适合游泳的耳机时&#xff0c;选择合适的产品至关重要。游泳不仅是一项身体锻炼&#xff0c;更是一种享受。佩戴耳机能够为游泳者提供更加愉悦的体验&#xff0c;但确保所选耳机符合水中使用的要求至关重要。 传统的有线耳机和非防水设计的蓝牙耳机并不适合水中使用&…

MongoDB聚合:$listSearchIndexes

$listSearchIndexes返回指定集合现有Atlas Search索引的信息。 **重要&#xff1a;**该命令只能在托管的MongoDB Allas&#xff0c;并且要求群集层级至少为M10。 语法 db.<collection>.aggregate([{$listSearchIndexes:{id: <indexId>,name: <indexName>}…

Codeforces Round 923 (Div. 3) C. Choose the Different Ones(Java)

比赛链接&#xff1a;Round 923 (Div. 3) C题传送门&#xff1a;C. Choose the Different Ones! 题目&#xff1a; ** Example** ** input** 6 6 5 6 2 3 8 5 6 5 1 3 4 10 5 6 5 6 2 3 4 5 6 5 1 3 8 10 3 3 3 4 1 3 5 2 4 6 2 5 4 1 4 7 3 4 4 2 1 4 2 2 6 4 4 2 1 5 2 3 …

[Doris] Doris的安装和部署 (二)

文章目录 1.安装要求1.1 Linux操作系统要求1.2 软件需求1.3 注意事项1.4 内部端口 2.集群部署2.1 操作系统安装要求2.2 下载安装包2.3 解压2.4 配置FE2.5 配置BE2.6 添加BE2.7 FE 扩容和缩容2.8 Doris 集群群起脚本 3.图形化 1.安装要求 1.1 Linux操作系统要求 1.2 软件需求 1…

四、OpenAI之文本生成模型

文本生成模型 OpenAI的文本生成模型(也叫做生成预训练的转换器(Generative pre-trained transformers)或大语言模型)已经被训练成可以理解自然语言、代码和图片的模型。模型提供文本的输出作为输入的响应。对这些模型的输入内容也被称作“提示词”。设计提示词的本质是你如何对…

JS游戏项目合集【附源码】

文章目录 一&#xff1a;迷宫小游戏二&#xff1a;俄罗斯方块三&#xff1a;压扁小鸟 一&#xff1a;迷宫小游戏 【迷宫游戏】是一款基于HTML5技术开发的游戏&#xff0c;玩法简单。玩家需要在一个迷宫中找到出口并成功逃脱&#xff0c;本项目还有自动寻路&#xff08;Track&a…

Python包管理器

文章目录 写在前面的话 切换安装源 查看包 检索包 安装特定的包 升级包 卸载包 生成冻结包 三方包的命名规则 写在后面的话 References 写在前面的话 在本章节中&#xff0c;我们介绍一下python最常用的一个包管理工具pip 一般来说下载我们python 的运行环境的时候在安装的时候…

Kubernetes构建Docker镜像部署jar包

Kubernetes构建Docker镜像部署jar包 Kubernetes是一个开源的容器编排引擎,它可以自动化地部署、扩展和管理容器化的应用程序。Docker镜像是一种轻量级、可移植的容器化应用程序打包格式,它可以在任何地方运行,而不需要额外的配置。 首先,需要准备一个基本的Dockerfile,它…

监测Nginx访问日志502情况后并做相应动作

今天带大家写一个比较实用的脚本哈 原理&#xff1a; 假设服务器环境为lnmp&#xff0c;近期访问经常出现502现象&#xff0c;且502错误在重启php-fpm服务后消失&#xff0c;因此需要编写监控脚本&#xff0c;一旦出现502&#xff0c;则自动重启php-fpm服务 场景&#xff1a; 1…

操作系统-程序员的自我修养

一、温故而知新 所有的应用程序都以进程process的方式运行在比操作系统权限更低的级别&#xff0c;每个进程都投自己独立的地址空间&#xff0c;使得进程之间的地址空间相互隔离。 抢占式CPU分配方式&#xff1a;操作系统可以强制剥夺CPU资源并且分配给它认为目前最需要的进程…

Java奠基】玩转字符串从基础到高级的操作技巧

目录 初识String StringBuilder StringJoiner 字符串原理 综合练习 初识String java.lang.String 类代表字符串&#xff0c;Java程序中的所有字符串文字(例如“abc”)都为此类的对象&#xff0c;例&#xff1a; String name "张三" 当使用双引号直接赋值时&…