数据仓库 最近连续3周活跃用户数
最近3周连续活跃的用户:通常是周一对前3周的数据做统计,该数据一周计算一次。
本例需求:计算上上周、上周、本周连续3周的活跃用户。
依赖数据:dws_uv_detail_wk(每周活跃设备明细表)。
建表语句:
drop table if exists ads_continuity_wk_count; create external table ads_continuity_wk_count( `dt` string COMMENT '统计日期,一般用结束周周日日期,如果每天计算一次,可用当天日期', `wk_dt` string COMMENT '持续时间', `continuity_count` bigint ) row format delimited fields terminated by '\t' location '/warehouse/gmall/ads/ads_continuity_wk_count';
数据导入脚本:
①concat(date_add(next_day('$do_date','MO'),-7*3),'_',date_add(next_day('$do_date','MO'),-1)) 表示从上上周周一到本周周日。
②having count(*)=3 因为周活表对日活的id进行了去重,所以,如果连续3周都有数据,则每周一条,加起来等于3。
#!/bin/bash if [ -n "$1" ];then do_date=$1 else do_date=`date -d "-1 day" +%F` fi hive=/opt/module/hive/bin/hive APP=gmall echo "-----------导入日期$do_date-----------" sql=" insert into table "$APP".ads_continuity_wk_count select '$do_date', concat(date_add(next_day('$do_date','MO'),-7*3),'_',date_add(next_day('$do_date','MO'),-1)), count(*) from ( select mid_id from "$APP".dws_uv_detail_wk where wk_dt>=concat(date_add(next_day('$do_date','MO'),-7*3),'_',date_add(next_day('$do_date','MO'),-7*2-1)) and wk_dt<=concat(date_add(next_day('$do_date','MO'),-7),'_',date_add(next_day('$do_date','MO'),-1)) group by mid_id having count(*)=3 )t1;" $hive -e "$sql"