如何在BigQuery中有效地分组两个字段?

时间:2017-10-04 12:03:06

标签: sql google-bigquery

我在BigQuery中有一个160GB的数据库,代表上个月从应用程序发送的事件。每行都有(以及其他)日期字段,userId字段和事件字段。

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

我尝试做的是按userId和按日期对用户进行分组,然后分别计算每个日期的userIds数量,例如:

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

但是,即使增加了计费等级,此查询也会返回“超出资源”,因此如果有更高效的方式,那将会很棒。

1 个答案:

答案 0 :(得分: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);