我一直在努力获取DAU的数量和每天安装的数量,这些数据由平台,OS_version,国家和其他几个用户数据分解。 想法是让查询返回如下内容:
date |DAU|Installs|Platform|OS_ver|country|
2017-05-01 | 2 | 0 |Android |5.0 | US |
2017-05-01 | 1 | 1 |Android |6.0 | US |
2017-05-01 | 1 | 1 |Android |6.0 | JP |
2017-05-01 | 3 | 0 |Android |6.0 | MX |
2017-05-01 | 10| 0 |Android |5.0 | MX |
如您所见,DAU和安装将由那些(以及其他一些)列传播。非常简单的分析查询。
所有信息都位于同一个表中,因此数据需要由表本身进行操作和连接。
一个不显示信息的列是事件列,其中包含要安装的事件和" screen" (每当用户打开游戏中的任何屏幕时,甚至在登录后立即调用屏幕事件,因此"屏幕"事件将用于计算DAU)。
我最初的想法是创建两个CTE,每个CTE只有事件过滤的记录,一个按安装事件过滤,另一个按屏幕事件过滤,然后我提取日期的一部分(在unix时间戳中)并在每个CTE中创建另一列,install_day用于计算安装CTE上的安装量,以及activity_day用于DAU CTE计算#DAU。
创建这两个CTE之后,我将使用平台加入它们,条件如下:dau_cte.platform = install_cte.platform。
我尝试以几种不同的方式创建查询但使用上述相同的逻辑,但每次都获得了大量重复数据。因此,我不想显示我的查询代码来帮助解决问题,而是希望从社区中听到您们将采用哪种方法来获取这些结果。
顺便说一句,此查询将在Presto中运行... 提前谢谢!答案 0 :(得分:0)
查询必须相当简单。最终查询应按date
,country
,platform
和os_ver
进行分组。据我所知,两个感兴趣的指标是某些唯一用户(或事件)标识符的不同计数。根据presto文档,没有类型COUNT_DISTINCT(X if Y)
的聚合,只留下在子查询中执行count不同,正如您所提到的。后面的查询就是这样做的。请注意使用COALESCE
来计算缺失的数据。
SELECT
a.date,
a.platform,
a.os_ver,
a.country,
COALESCE(a.DAU, 0) as DAU,
COALESCE(b.installs, 0) as installs,
FROM (
SELECT
date,
platform,
os_ver,
country,
COUNT(DISTINCT <user_id>) AS DAU
FROM <table_name>
WHERE event_name = 'screen'
GROUP BY 1,2,3,4
) a
FULL JOIN (
SELECT
date,
platform,
os_ver,
country,
COUNT(DISTINCT <user_id>) AS installs
FROM <table_name>
WHERE event_name = 'install'
GROUP BY 1,2,3,4
) b
ON
a.date = b.date
AND a.platform = b.platform
AND a.os_ver = b.os_ver
AND a.country = b.country