最近七天内连续三天活跃用户数

这篇博客详细介绍了如何利用Hive SQL查询最近七天内连续三天活跃的用户。首先,创建数据表并加载HDFS文件,接着通过rank()函数获取用户每日活跃排名。然后,计算日期差值,筛选出连续登录的用户。通过分组和计数,找出满足条件的用户,去除重复的用户ID。最后,展示2021-08-10这天满足条件的活跃用户数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近七天内连续三天活跃用户数

建表:

create table uv_detail_daycount(
mid int
)PARTITIONED BY(dt string);

通过load将hdfs文件加载到hive中。
数据文件名如下:
在这里插入图片描述
里面的数据只有用户mid。如下所示:
在这里插入图片描述

每个日期对应的用户mid,即为该天活跃。
在这里插入图片描述
通过上图可以发现,最近七天内连续三天活跃用户数应该是001和002号用户,最终2021-08-10这天的最近七天内连续三天活跃用户数为2.

实现

第一步,查询最近七天的数据,并按照日期从小到大进行排序。

select 
	mid,
	dt,
	rank() over(partition by mid order by dt) mid_dt_rank
	from uv_detail_daycount
	where dt >=date_add('2021-08-10',-6) and dt<='2021-08-10'

在这里插入图片描述
第二步,求日期和排名的差值.

with t1 as (select 
	mid,
	dt,
	rank() over(partition by mid order by dt) mid_dt_rank
	from uv_detail_daycount
	where dt >=date_add('2021-08-10',-6) and dt<='2021-08-10')
	
select 
	mid,
	date_sub(dt, mid_dt_rank) date_dif
from
	t1;

在这里插入图片描述
第三步,对用户和差值进行分组,然后通过having选择差值相同个数大于等于3的数据取出。

with t1 as (select 
	mid,
	dt,
	rank() over(partition by mid order by dt) mid_dt_rank
	from uv_detail_daycount
	where dt >=date_add('2021-08-10',-6) and dt<='2021-08-10'),
	t2 as (select 
	mid,
	date_sub(dt, mid_dt_rank) date_diff
	from t1)

SELECT mid 
from 
	t2
	group by mid, date_diff
	HAVING count(*) >= 3;

在这里插入图片描述
第四步,根据用户id去重(为什么会出现重复的mid?最近七天可能用户前3天用户连续登录满足所求指标的要求,后三天也是如此,所以会出现mid重复。这个mid可以理解为该用户满足指标的次数吧,但是指标求的是活跃用户数,所以要去重)

with t1 as (select 
	mid,
	dt,
	rank() over(partition by mid order by dt) mid_dt_rank
	from uv_detail_daycount
	where dt >=date_add('2021-08-10',-6) and dt<='2021-08-10'),
	t2 as (select 
	mid,
	date_sub(dt, mid_dt_rank) date_diff
	from t1),
	t3 as (SELECT mid 
	from 
	t2
	group by mid, date_diff
	HAVING count(*) >= 3)
	
select mid	
from
	t3
	group by mid;

在这里插入图片描述
第五步,整理显示:

with t1 as (select 
	mid,
	dt,
	rank() over(partition by mid order by dt) mid_dt_rank
	from uv_detail_daycount
	where dt >= date_add('2021-08-10',-6) and dt <= '2021-08-10'),
	t2 as (select 
	mid,
	date_sub(dt, mid_dt_rank) date_diff
	from t1),
	t3 as (SELECT mid 
	from 
	t2
	group by mid, date_diff
	HAVING count(*) >= 3),
	t4 as(select mid	
from
	t3
	group by mid) 

select 
	'2021-08-10',
	concat(date_add('2021-08-10',-6),'至','2021-08-10'),
	count(*)
from 
	t4;

在这里插入图片描述

### 如何统计用户活跃度 #### 使用Redis进行高效活跃用户统计 对于大规模用户基数的应用场景,传统的关系型数据库如MySQL在处理高并发读写和复杂聚合查询时性能表现不佳。针对这一挑战,采用NoSQL解决方案之一——Redis能够显著优化活跃用户统计数据的实时性和准确性。 通过利用Redis的数据结构特性,特别是其高效的集合操作命令`setbit`,可以在极大程度上减少存储空间占用并加速访问速度。每当有新用户登录系统时,在对应的日期标记该用户的唯一标识符;当需要获取特定周期内的DAU(日活)、WAU(周活)或MAU(月活)数值时,则只需简单地执行按位逻辑运算即可得出结果[^4]。 ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) def record_user_activity(user_id, date_str): key_name = f"user_active:{date_str}" r.setbit(key_name, user_id, 1) def get_daily_active_users(date_str): key_name = f"user_active:{date_str}" return sum([int(x) for x in list(r.getrange(key_name, 0, -1))]) # 记录某天某个用户的活动情况 record_user_activity(12345, '2023-10-01') # 获取指定日期的日活跃用户数 print(get_daily_active_users('2023-10-01')) ``` 此方法不仅解决了海量数据下的性能瓶颈问题,还提供了灵活的时间维度支持,使得开发者可以根据实际需求轻松调整统计粒度。 #### 定义不同时间范围内的活跃率指标 为了全面评估产品的健康状况和发展趋势,除了关注每日新增注册人数外,还需要深入理解现有用户的参与频率及其变化规律。因此定义了多个层次上的活跃度衡量标准: - **日活跃用户数 (Daily Active Users, DAU)**:指每天至少有一次有效行为记录的独立访客总数; - **周活跃用户数 (Weekly Active Users, WAU)**:过去七日内有过互动经历的人群规模; - **月活跃用户数 (Monthly Active Users, MAU)**:近三十天内保持一定频次使用的个体数量[^3]。 这些KPIs有助于管理层及时发现潜在风险点,并据此制定针对性策略促进长期稳定增长。 #### 数据可视化工具助力决策过程 最后值得一提的是,借助先进的数据分析平台绘制直观易懂的信息图表同样重要。例如桑基图(Sankey Diagram),它能清晰展示各个渠道之间的流量转移路径以及转化效率,帮助产品经理快速定位影响因素并验证假设效果[^1]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值