我试图使用布尔列进行分区,而我也使用布尔列进行分组。列是应用函数,而不是有机列的结果。
对于Legacy-SQL,这可以使用分区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]发布于 2017-04-30 12:02:46
您将需要使用标准SQL的子查询。遗留SQL支持一些非标准的功能,这些功能往往会在角落的情况下崩溃。
#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;发布于 2017-04-30 14:21:17
列是应用函数,而不是有机列的结果。
下面是用BigQuery标准SQL表示这种情况(派生列)的一种简单方法,因此用Legacy编写的查询可以保持原样(而不引入额外的子查询)。
#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中实际使用的查询。您可能会“过度简化”它,以显示派生列的问题-在本例中忽略下面的内容。但是,如果这个查询正是您所使用的,那么它就没有多大意义,下面的查询也是如此。
#standardSQL
SELECT
corpus = 'sonnets' AS sonnetsCorp,
COUNT(DISTINCT word) cnt
FROM `bigquery-public-data.samples.shakespeare`
GROUP BY sonnetsCorp 您构造比率字段的方式使其始终等于1!
https://stackoverflow.com/questions/43705957
复制相似问题