【问题标题】:How to effectively group by two fields in BigQuery?如何有效地按 BigQuery 中的两个字段分组?
【发布时间】:2017-10-04 12:03:05
【问题描述】:

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

我需要做的是找出在某一天使用过该应用的唯一身份用户数量。例如,如果用户 X 在 2017 年 9 月 15 日使用了 3 次应用程序,则当天只计算一次,但如果他在 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

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

【问题讨论】:

    标签: sql google-bigquery


    【解决方案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);
    

    【讨论】:

    • 谢谢。这工作速度很快,实际上使用的资源很少。
    • @leonz 。 . .很高兴知道。我添加了一个在 Postgres 和其他一些数据库中效果更好的替代方案。
    猜你喜欢
    • 2018-08-03
    • 2019-11-04
    • 2021-10-20
    • 2014-12-19
    • 2022-07-28
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多