BigQuery 如何在时间范围内展平表集合后进行分组

BigQuery how to group by after flattening a collection of tables over timerange

我正在尝试执行以下操作:

  1. 使用FROM TABLE_DATE_RANGE
  2. 在一个时间范围内合并表格
  3. FLATTEN那组数据
  4. GROUP BY 列 X
  5. SELECT ColumnX、SUM(ColumnY)、SUM(ColumnZ) 仅针对唯一的 ColumnX 值。

这是我的查询要点:

SELECT
  r.ColumnX
  ,SUM(r.ColumnY)
  ,SUM(r.ColumnZ)
FROM
(
    SELECT *
    FROM FLATTEN(
    (
        SELECT
          ColumnX
          ,ColumnY
          ,ColumnZ

        FROM TABLE_DATE_RANGE(projectx.events_,
          TIMESTAMP('2015-09-01'), TIMESTAMP('2015-09-08'))), my_funky_object
    )
    WHERE ColumnY > 10
) r
GROUP BY
  r.ColumnX

问题是,我得到的行数比 ColumnX 的唯一值数应该多得多。于是我退一步简单的输出了GROUP BY - COUNT of ColumnX以便debug,得到如下输出!

我得到了一个中间结果。

发生了什么,我如何确保我的外部 select 仅聚合 ColumnX 的唯一值?

您正在获取 ColumnX 的每个不同值的计数,但您只显示计数,而不是值。

如果您的目标是准确计算不同值的数量,请尝试如下操作:

SELECT
  COUNT(*) ct
FROM (
  SELECT
    1
  FROM
    ... rest of your query ...
  GROUP BY r.ColumnX
)

对于 ColumnX 的每个不同值,该内部查询将恰好为您提供一行(每行的值为 1)。外部 select 语句将计算此类行的数量。

另一种方法是使用 EXACT_COUNT_DISTINCT 来获取准确的行数。这比使用 GROUP BY 更简单,但可扩展性更差。