Google Big Query中的GROUP BY问题

Loc*_*eek 5 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
Run Code Online (Sandbox Code Playgroud)

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

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

我得到的错误是:

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

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

calcGROUP BY列表中不存在表达式' '

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

(L7:1):不能按聚合分组

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

Mic*_*tin 3

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

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

您可以选择 id 字段的 max、min 等;按此字段分组(但随后您会得到 term、lingcat 和 id 的每个元组的计算);或者如果您不需要它,则删除此字段 - 如果您想要每个 (nonstops.term, nonstops.lincat) 对的 'calc' 表达式的结果。

BigQuery 抱怨“calc”的原因有所不同 - BigQuery(当您使用旧版 SQL 方言时)不使用反引号 (`) 进行引用。因此它认为它们是名称的一部分,并且它是与“calc”字段分开的新字段。只需删除它们或使用 BigQuery 的引号 [ 和 ] - 即可[calc]。或者切换到标准 SQL 方言。