【问题标题】:BigQuery GroupBy with STRUCTBigQuery GroupBy 与 STRUCT
【发布时间】:2018-05-25 08:11:34
【问题描述】:

在 BigQuery 中,我可以使用标准 SQL 成功运行以下查询:

SELECT 
  COUNT(*) AS totalCount,
  city,
  DATE_TRUNC(timeInterval.intervalStart, YEAR) AS start
FROM 
  sandbox.CountByCity
GROUP BY 
    city, start

但是当我将 start 值嵌套在 STRUCT 中时它会失败,就像这样......

SELECT 
  COUNT(*) AS totalCount,
  city,
  STRUCT(
    DATE_TRUNC(timeInterval.intervalStart, YEAR) AS start
  ) as timeSpan
FROM 
  sandbox.CountByCity
GROUP BY 
    city, timeSpan.start

在这种情况下,我收到以下错误消息:

无法从 [10:11] 的 SELECT 列表别名 timeSpan 中对字段引用进行 GROUP BY

编写查询以使start 值嵌套在STRUCT 中的正确方法是什么?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您可以使用ANY_VALUE 执行此操作。您获得的结构值是明确定义的,因为整个组的值是相同的:

    SELECT 
      COUNT(*) AS totalCount,
      city,
      ANY_VALUE(STRUCT(
        DATE_TRUNC(timeInterval.intervalStart, YEAR) AS start
      )) as timeSpan
    FROM 
      sandbox.CountByCity
    GROUP BY 
        city, DATE_TRUNC(timeInterval.intervalStart, YEAR);
    

    这是一个使用一些示例数据的示例:

    WITH `sandbox.CountByCity` AS (
      SELECT 'Seattle' AS city, STRUCT(DATE '2017-12-11' AS intervalStart) AS timeInterval UNION ALL
      SELECT 'Seattle', STRUCT(DATE '2016-11-10' AS intervalStart) UNION ALL
      SELECT 'Seattle', STRUCT(DATE '2017-03-24' AS intervalStart) UNION ALL
      SELECT 'Kirkland', STRUCT(DATE '2017-02-01' AS intervalStart)
    )
    SELECT 
      COUNT(*) AS totalCount,
      city,
      ANY_VALUE(STRUCT(
        DATE_TRUNC(timeInterval.intervalStart, YEAR) AS start
      )) as timeSpan
    FROM 
      `sandbox.CountByCity`
    GROUP BY 
        city, DATE_TRUNC(timeInterval.intervalStart, YEAR);
    

    您还可以考虑使用submitting a feature request 启用GROUP BYSTRUCT 类型。

    【讨论】:

      【解决方案2】:

      不知道你到底为什么想要这个——但相信这是出于某种原因——所以在下面试试(至少在形式上它会按照你的要求做)

      #standardSQL
      SELECT
        totalCount, 
        city, 
        STRUCT(start) timeSpan
      FROM (
        SELECT 
          COUNT(*) AS totalCount,
          city,
          DATE_TRUNC(timeInterval.intervalStart, YEAR) AS start
        FROM `sandbox.CountByCity`
        GROUP BY city, start
      )
      

      【讨论】:

        猜你喜欢
        • 2023-01-13
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        相关资源
        最近更新 更多