首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigQuery标准SQL:使用按列分组的分区

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

Stack Overflow用户
提问于 2017-04-30 11:38:36
回答 2查看 2.2K关注 0票数 1

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

对于Legacy-SQL,这可以使用分区by子句中的列名。在标准SQL中,不可能使用列名,而且当重写列定义时会出现错误。

代码语言:javascript
复制
#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

我收到一个错误:

代码语言:javascript
复制
Unrecognized name: sonnetsCorp at [5:68]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-30 12:02:46

您将需要使用标准SQL的子查询。遗留SQL支持一些非标准的功能,这些功能往往会在角落的情况下崩溃。

代码语言:javascript
复制
#standardSQL
SELECT
 sonnetsCorp,
 count(distinct word) cnt,
 count(distinct word)/sum(count(distinct word)) over (partition by sonnetsCorp) ratio
FROM (
  SELECT
   *,
   corpus = 'sonnets' AS sonnetsCorp
  FROM `bigquery-public-data.samples.shakespeare`
)
GROUP BY sonnetsCorp;
票数 1
EN

Stack Overflow用户

发布于 2017-04-30 14:21:17

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

下面是用BigQuery标准SQL表示这种情况(派生列)的一种简单方法,因此用Legacy编写的查询可以保持原样(而不引入额外的子查询)。

代码语言:javascript
复制
#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,这可以使用分区by子句中的列名。

同时,我觉得在您的问题中,您提出了一个在Legacy SQL中实际使用的查询。您可能会“过度简化”它,以显示派生列的问题-在本例中忽略下面的内容。但是,如果这个查询正是您所使用的,那么它就没有多大意义,下面的查询也是如此。

代码语言:javascript
复制
#standardSQL
SELECT
  corpus = 'sonnets' AS sonnetsCorp,
  COUNT(DISTINCT word) cnt
  FROM `bigquery-public-data.samples.shakespeare`
GROUP BY sonnetsCorp  

您构造比率字段的方式使其始终等于1!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43705957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档