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

Sql 查询以获取DAU并使用自连接进行安装,sql,analytics,presto,Sql,Analytics,Presto,我一直在努力获取DAU的数量和每天的安装数量,这些数据被一些用户数据分解,比如平台、OS_版本、国家和其他一些专栏。 其目的是让查询返回如下内容: 日期| DAU |安装|平台|操作系统版本|国家| 2017-05-01 | 2 | 0 |安卓| 5.0 |美国| 2017-05-01 | 1 | 1 |安卓| 6.0 |美国| 2017-05-01 | 1 | 1 |安卓| 6.0 | JP| 2017-05-01 | 3 | 0 |安卓| 6.0 | MX| 2017-05-01 | 10

我一直在努力获取DAU的数量和每天的安装数量,这些数据被一些用户数据分解,比如平台、OS_版本、国家和其他一些专栏。 其目的是让查询返回如下内容:

日期| DAU |安装|平台|操作系统版本|国家| 2017-05-01 | 2 | 0 |安卓| 5.0 |美国| 2017-05-01 | 1 | 1 |安卓| 6.0 |美国| 2017-05-01 | 1 | 1 |安卓| 6.0 | JP| 2017-05-01 | 3 | 0 |安卓| 6.0 | MX| 2017-05-01 | 10 | 0 |安卓| 5.0 | MX|

如您所见,DAU和安装将由这些列和其他一些列传播。非常简单的分析查询

所有信息都位于同一个表中,因此数据需要由表本身进行操作和连接

一个不会显示信息的列是event列,其中包含安装和屏幕事件。每当用户打开游戏中的任何屏幕时,甚至在登录后,屏幕事件都会被调用,因此屏幕事件将用于计算DAU

我最初的想法是创建两个CTE,每个CTE只有通过事件过滤的记录,一个是通过安装事件过滤的,另一个是通过屏幕事件过滤的,然后我提取日期中的日期部分,在unix时间戳中,并在每个CTE中创建另一列,install_day来计算安装CTE上的安装次数,以及DAU CTE计算DAU的活动日

创建这两个cte后,我将使用平台作为条件加入它们,如:dau_cte.platform=install_cte.platform

我已经尝试过以几种不同的方式创建这样的查询,但是使用了上面描述的相同逻辑,但是每次都会得到大量重复数据。因此,我不想展示我的查询代码来帮助修复它,我想听听社区的意见,你们会用什么方法来获得这些结果

顺便说一句,此查询将在Presto中运行。。。
提前谢谢

查询必须相当简单。最终查询应按日期、国家/地区、平台和版本分组。据我所知,感兴趣的两个度量是某些唯一用户或事件标识符的不同计数。根据presto docs,没有COUNT\u DISTINCTX if Y类型的聚合,这只剩下在子查询中执行COUNT distinct,如您所述。接下来的查询就可以做到这一点。注意使用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

谢谢你,尼古拉,我稍后会尝试并发回结果。大家都记得联合的必要性。当我向该查询中添加更多列时,是否应在子查询中、group by子句中以及ON条件下的后面添加新列?是的,除非您使用其他唯一标识符group by或UDAF进行不同计数。