SQL拿捏:活跃用户数统计案例类型SQL 全网拿捏同款SQL



活跃用户数统计

  • 作为大数据开发人员,绝不能丢下SQL能力。

一、介绍

在我们工作ETL或者在进行大数据面试的时候,总是常常会被手撕SQL,而常见的S统计活跃用户数问题。一般的问法是 当日活跃用户数、本周活跃用户数、本月活跃用户数等问题。
小编今天在这里给大家介绍两种方案轻松让你拿捏这类SQL问题

1、数据和表的准备

create external table usr_active_cnt(
    `dt` string COMMENT '统计日期',
    `day_count` bigint COMMENT '当日用户数量',
    `wk_count`  bigint COMMENT '当周用户数量',
    `mn_count`  bigint COMMENT '当月用户数量',
    `is_weekend` string COMMENT 'Y,N是否是周末,用于得到本周最终结果',
    `is_monthend` string COMMENT 'Y,N是否是月末,用于得到本月最终结果'
) COMMENT '活跃用户数'
stored as parquet
location 'hdfs://hdfs/...';

2、思路

  • 明确需求和思路
    • 当日活跃用户数,我们对当日的数据(where)进行统计(count)
    • 周活跃用户数,对本周内只要活跃过的用户进行统计,也就是活跃日期在本周一到当前日期范围内
    • 月活跃用户数,对本月内只要活跃过的用户数进行统计,也就是活跃日期在本月内到当前日期范围内
      • 注意,为了后期需求方便,可以对统计的日期进行在这进行判断是否是本周的最后一天或者本月的最后一天
    • 用统计日期进行关联三个查询的数据,为后期方便,在这里做了统计日是否为本周或者本月末。然后数据一并写入到活跃表中

3、代码

---日活跃数统计
with daycount as (
	SELECT
		'2023-01-01' dt,
		count(user_id) day_cnt
	from tb
	where activity_date = '$today_dt'
),
---周跃数统计
wkcount as(
	SELECT
		'2023-01-01' dt,
		count(user_id) wk_cnt
	from tb
	where activity_date >=date_add(next_date(activity_date,'MO'),-7)
	and activity_date <= '$dt'
),
---月跃数统计
mncount as (
	SELECT
		'2023-01-01' dt,
		count(user_id) mn_cnt
	from tb
	where date_format(activity_date,'yyyy-MM') = date_format('$dt','yyyy-MM') 
)
--是将查询的活跃数据进行整合在一起一起写入活跃表中
insert into table.usr_active_cnt 
SELECT
	dt,
	day_cnt,
	wk_cnt,
	mn_cnt,
	if(date_add(next_day(dt,'MO'),-1)=daycount.dt,'Y','N') as is_weekend,
	if(last_day(dt)=mncount.dt,'Y','N') as is_mn
from daycount
left  join wkcount on daycount.dt  = wkcount.dt
left join mncount on daycount.dt  = mncount.dt

猜你喜欢

转载自blog.csdn.net/m0_49303490/article/details/130476010