获取按日期分组的最近n天的活动用户数量

时间:2018-02-06 09:46:30

标签: mysql hive hiveql

假设我有一个Hive表logins,其中包含以下列:

user_id | login_timestamp

我现在有兴趣获得一些活动KPI。例如,每日活跃用户:

SELECT 
to_date(login_timestamp) as date,
COUNT(DISTINCT user_id) daily_active_user
FROM
logins
GROUP BY to_date(login_timestamp)
ORDER BY date asc

将其从每日活动更改为每周/每月活动并不是很重要,因为我可以交换to_date()函数来获取月份,然后按该值进行分组。

我现在想要得到的是按日期分组的最近n天(例如3)中活跃的用户数量。此外,我正在寻找的解决方案适用于可变时间窗口,而不仅仅是一天(在第x天获取最近3天的活跃用户数量只会很容易)。

结果应该有点像这样:

date, 3d_active_user
2017-12-01, 111
2017-12-02, 234
2017-12-03, 254
2017-12-04, 100
2017-12-05, 103
2017-12-06, 103
2017-12-07, 230

在第一个选择(例如select x, (select max(x) from x) as y from z)中使用子查询构建移动时间窗口的变通方法是不可能的,因为我使用的Hive版本不支持它。

我试过像COUNT(DISTINCT IF(DATEDIFF(today,login_date)<=3,user_id,null))这样的运气,但到目前为止我尝试的一切都没有用。

您对如何解决此问题有任何想法吗? 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

您可以使用“BETWEEN”功能。 如果要查找活动用户,请从特定日期登录到现在。

SELECT to_date(login_timestamp) as date,COUNT(DISTINCT user_id) daily_active_user FROM logins WHERE login_timestamp BETWEEN startDate_timeStamp AND now() GROUP BY to_date(login_timestamp) ORDER BY date asc

如果您想要在特定日期范围内登录用户的活跃用户,请执行以下操作: 注意: -

SELECT to_date(login_timestamp) as date,COUNT(DISTINCT user_id) daily_active_user FROM logins WHERE login_timestamp BETWEEN to_date(startDate_timeStamp) AND to_date(endDate_timeStamp) GROUP BY to_date(login_timestamp) ORDER BY date asc