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

时间:2015-09-09 02:45:47

标签: sql google-bigquery

我试图执行以下操作:

  1. 使用FROM TABLE_DATE_RANGE
  2. 在一个时间范围内组合表格
  3. FLATTEN该数据集
  4. GROUP BY ColumnX
  5. 仅使用唯一的ColumnX值选择ColumnX,SUM(ColumnY),SUM(ColumnZ)。
  6. 这是我的疑问的要点:

    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的ColumnX进行调试,我得到以下输出!

    我看起来像中间结果。

    enter image description here

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

1 个答案:

答案 0 :(得分:2)

您获得了ColumnX的每个不同值的计数,但您只显示计数,而不是值。

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

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

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

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