2017-10-04 72 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和其他數據庫中更好的替代方案。 –

相關問題