考虑以下BigQuery查询:
SELECT
tn.object AS object_alias,
tn.attribute1 AS attribute1_alias,
tn.attribute2 AS attribute2_alias,
tn.score AS score_alias,
ROW_NUMBER() OVER (PARTITION BY attribute1_alias, attribute2_alias ORDER BY score_alias DESC) AS row_num_alias
FROM
[datasetName.tableName] tn
HAVING # also causes error when using WHERE
row_num_alias <= 20
在此查询中,row_num_alias
子句中对HAVING
字段的引用导致以下错误:Field 'row_num_alias' not found.
替换HAVING
子句时出现相同的错误使用WHERE
子句,似乎所有窗口函数都会抛出此错误。
这是BigQuery中的错误吗?或者我的查询中是否有其他错误?
可能相关:
一种解决方法是将其转换为子查询并将WHERE
子句移到子查询之外(见下文),但这看起来很麻烦(并且希望不是必需的)。
SELECT
object_alias,
attribute1_alias,
attribute2_alias,
score_alias,
row_num_alias
FROM
(SELECT
tn.object AS object_alias,
tn.attribute1 AS attribute1_alias,
tn.attribute2 AS attribute2_alias,
tn.score AS score_alias,
ROW_NUMBER() OVER (PARTITION BY attribute1_alias, attribute2_alias ORDER BY score_alias DESC) AS row_num_alias
FROM
[datasetName.tableName] tn
)
WHERE
row_num_alias <= 20
答案 0 :(得分:5)
列别名在WHERE
子句中不起作用,即使在BigQuery中也是如此。虽然有些数据库确实支持,但无法保证它们在HAVING
子句中工作。列别名可以在ORDER BY
中使用;我认为标准的这种支持是逐步逐步淘汰的一部分。
您知道正确的解决方案,即使用子查询。
顺便说一句,没有HAVING
的{{1}}子句看起来很尴尬。这样的构造经常在MySQL中使用,但仅作为一种解决方法 - MySQL中的子查询比其他数据库产生更多的开销,因为优化器并不那么复杂。