Google Big Query中的GROUP BY问题

时间:2015-06-06 18:09:45

标签: google-bigquery

我是Google Big Query(和Stack Overflow)的新手,主要测试Big Query管理精心设计和精心设计的查询的速度。

我在MySQL上运行(缓慢)的繁琐查询时遇到了困难。 Big Query抱怨GROUP BY内容。这是起始查询:

SELECT nonstops.term, nonstops.lincat, nonstops.id, 
MIN(
(1-((LEAST(1,minusone.catimp / nonstops.catimp) + LEAST(1,minusone.catweb / nonstops.catweb))/2))*
(1-((LEAST(1,minusone.catimp / nonstops.catimp) + LEAST(1,minusone.catweb / nonstops.catweb))/2))*
(1-((LEAST(1,minusone.catimp / nonstops.catimp) + LEAST(1,minusone.catweb / nonstops.catweb))/2))*
(nonstops.catweb * nonstops.catweb * nonstops.catimp / nonstops.fnvweb / nonstops.fnvimp)
)
AS calc FROM nonstops INNER JOIN EACH minusone ON nonstops.lincat = minusone.lincat AND nonstops.term = minusone.term 
WHERE nonstops.lincat = 556 GROUP BY nonstops.term, nonstops.lincat
ORDER BY `calc`  DESC

请注意,“EACH”会添加到INNER JOIN中,因为两个表都很大。我删除了数据集名称以便于阅读。

GROUP BY旨在仅返回每个术语/ lincat对的连接所做计算的最低值。

我得到的错误是:

(L1:62):GROUP BY列表中不存在表达式“phrase.nonstops.id”

我不想在GROUP BY中,但我添加了它,然后我得到:

GROUP BY列表中不存在表达式“calc

我也不想要!但如果我添加它,我会得到:

(L7:1):无法按汇总分组

我查看了文档并搜索了答案,但没有运气。任何提示或链接将是最受欢迎的。

1 个答案:

答案 0 :(得分:3)

当您按BigQuery(或任何SQL)中的内容进行分组时,结果字段应该是分组字段或聚合。

否则,你应该获得nonstops.id的值?可能有许多与一对(nonstops.term,nonstops.lincat)相关联。

您可以选择id字段的max,min等;按此字段分组(但是你可以计算每个术语,lingcat和id的元组);或者只是删除此字段,如果您不需要它 - 如果您想要' calc'每个(nonstops.term,nonstops.lincat)对的表达式。

BigQuery抱怨`calc`的原因是不同的 - BigQuery(当你使用遗留的SQL方言时)不使用反引号(`)来引用。所以它认为它们是名称的一部分,它是一个独立于' calc'领域。只需删除它们或使用BigQuery的引用[和] - [calc]即可。或者切换到标准的SQL方言。