最近业务方打算做一个用户唤醒的活动,准备以现金红包的方式进行拉活。其中提了一份数据需求:需要一份最近15天内,活跃天数少于3天的用户,打算将这批用户唤醒。
拿到需求后简单构思,首先是在半个月内有活跃过,但是需要活跃天数少于3天的,可以是不连续的3天。
观察我们的hive数据,有一份活跃用户表,因为imei、idfv在客户端采集的过程中存在一定的问题,表中主要是按照手机号来统计标识,且表是以dt作为分区的
phone | dt |
---|---|
1300000000 | 20200401 |
1300000001 | 20200401 |
1300000002 | 20200401 |
1300000000 | 20200402 |
1300000001 | 20200402 |
1300000003 | 20200402 |
1300000000 | 20200403 |
1300000007 | 20200403 |
1300000009 | 20200403 |
- 那么意思就是,只要这个用户的标识出现在15个分区中就行了,SQL表现就是count(distinct dt),同时需要少于3天的用户,SQL表现即having count(distinct dt ) < 3
那么思路有了之后就是代码如何实现了
核心部分伪代码:
SELECT
phone,
count(DISTINCT dt) AS active_count
FROM bigdata.tables
WHERE dt BETWEEN '20200401' AND '20200415'
GROUP BY phone
HAVING count(DISTINCT dt) <3
其实也就是把统计的指标变成了我们的分区,有思路之后其实SQL不难写