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

Posted

技术标签:

【中文标题】获取按日期分组的最近 n 天的活跃用户数量【英文标题】:Get amount of active user of the last n days grouped by date 【发布时间】:2018-02-06 09:46:30 【问题描述】:

假设我有一个 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】:

您可以使用“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

【讨论】:

我猜你的第二种方法在设置固定的开始/结束日期时会起作用。但是,我特别不想这样做,以便能够在一次查询中获取超过一天的统计信息。

以上是关于获取按日期分组的最近 n 天的活跃用户数量的主要内容,如果未能解决你的问题,请参考以下文章

flink sql 近3天登录次数

flink sql 近3天登录次数

如何使用窗口函数获取每个日期值的今天、过去 7 天、过去 30 天的指标?

如何按日期分组,考虑时区和 DST?

SQL—对学校和性别进行分组,计算用户活跃度和发帖数量

统计最近几天的分组数据