2017-10-04 38 views
0

我在BigQuery中有一个160GB的数据库,代表上个月从应用发送的事件。每行都有(除其他外)日期字段,userId字段和事件字段。如何通过BigQuery中的两个字段进行有效分组?

我需要做的是找出有多少独特用户在某一天使用过该应用。例如,如果用户X在2017年9月15日前使用过应用三次,那么当天只计算一次,但如果他在2017年9月15日,2017年9月16日和2017年9月17日期间使用了该应用,在那些日子里每一天都只算他一次(只有一次)。

我试图做的是用户id和日期用户组,然后分别计算的用户id号为每个日期,例如:

SELECT 
    userId, 
    DATE(date) AS date_conv 
FROM 
    [TABLE] 
WHERE 
    userId IS NOT NULL 
GROUP BY 
    date_conv, 
    userId 
ORDER BY 
    userId 

然而,该查询返回“资源突破”,甚至随着计费层次的增加,如果能够采用更有效的方式,那将会很不错。

回答

1

如果要计算唯一身份用户数,然后用count(distinct)

SELECT DATE(date) AS date_conv, COUNT(DISTINCT userId) as numusers 
FROM [TABLE] 
GROUP BY DATE(date) 
ORDER BY DATE(date); 

你可能得到的资源超过了因为ORDER BY的。

编辑:

我还没有BigQuery的一个非常大的数据量上尝试COUNT(DISTINCT)。在一些数据库中,嵌套聚合优化得更好:

SELECT DATE(date) AS date_conv, COUNT(*) as numusers 
FROM (SELECT DATE(date) AS date_conv, userId 
     FROM [TABLE] 
     GROUP BY DATE(date), userId 
    ) du 
GROUP BY DATE(date) 
ORDER BY DATE(date); 
+0

谢谢。这工作很快,实际上使用少量的资源。 – leonz

+0

@leonz。 。 。很高兴知道。我添加了一个在Postgres和其他数据库中更好的替代方案。 –

相关问题