查询以获取DAU并使用自联接进行安装

时间:2017-07-15 15:33:56

标签: sql analytics presto

我一直在努力获取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中运行... 提前谢谢!

1 个答案:

答案 0 :(得分:0)

查询必须相当简单。最终查询应按datecountryplatformos_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