BigQuery Group通过STRUCT

Gre*_*all 5 sql google-bigquery

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

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

但是当我将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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ell*_*ard 7

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

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);
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

你也可以考虑提交功能请求,以使GROUP BYSTRUCT类型。