BigQuery标准SQL:使用按列分组的分区

时间:2017-04-30 11:38:36

标签: google-bigquery

我尝试使用布尔列进行分区,我也用它来分组。该列是应用函数的结果,而不是有机列。

使用Legacy-SQL,这可以使用partition by子句中的列名。在标准SQL中,无法使用列名,并且在重写列定义时会出现错误。

#standardSQL
SELECT 
 corpus = 'sonnets' sonnetsCorp,
 count(distinct word) cnt,
 count(distinct word)/sum(count(distinct word)) over (partition by corpus = 'sonnets') ratio
FROM `bigquery-public-data.samples.shakespeare` 
 group by 1

我收到错误:

Unrecognized name: sonnetsCorp at [5:68]

2 个答案:

答案 0 :(得分:2)

  

该列是应用函数的结果,而不是有机列。

下面是在BigQuery Standard SQL中表达此案例(派生列)的简单方法,因此使用旧版SQL编写的查询几乎可以保留(不引入额外的子查询)

  
#standardSQL
SELECT
  sonnetsCorp,
  COUNT(DISTINCT word) cnt,
  COUNT(DISTINCT word)/SUM(COUNT(DISTINCT word)) OVER (PARTITION BY sonnetsCorp) ratio
  FROM `bigquery-public-data.samples.shakespeare`, UNNEST([corpus = 'sonnets']) AS sonnetsCorp
GROUP BY sonnetsCorp  

以上, UNNEST([corpus = 'sonnets']) AS sonnetsCorp看起来像交叉连接,但实际上它只是基于每行计算的派生列!

  

使用Legacy-SQL,这可以使用分区依据

中的列名

与此同时,我觉得在您的问题中,您提出了一个您在Legacy SQL中实际使用的查询。你可能会过度简化"它是为了显示您的派生列的问题 - 在这种情况下忽略下面。但是,如果这个查询正是你所使用的 - 它没有多大意义,而且下面的查询完全相同

#standardSQL
SELECT
  corpus = 'sonnets' AS sonnetsCorp,
  COUNT(DISTINCT word) cnt
  FROM `bigquery-public-data.samples.shakespeare`
GROUP BY sonnetsCorp  

你构建比率字段的方式使它总是等于1!

答案 1 :(得分:1)

您需要使用带有标准SQL的子查询。旧版SQL支持一些非标准功能,这些功能在极端情况下会出现故障。

 $(document).ready(function() {
   $("#parentDiv .childLine")[$("#parentDiv .childLine").length-1].style = "display:none";
 });