窗口函数字段的别名导致"未找到"在HAVING和WHERE子句中使用时出错

时间:2016-01-27 16:00:18

标签: sql google-bigquery alias window-functions

考虑以下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

1 个答案:

答案 0 :(得分:5)

列别名在WHERE子句中不起作用,即使在BigQuery中也是如此。虽然有些数据库确实支持,但无法保证它们在HAVING子句中工作。列别名可以在ORDER BY中使用;我认为标准的这种支持是逐步逐步淘汰的一部分。

您知道正确的解决方案,即使用子查询。

顺便说一句,没有HAVING的{​​{1}}子句看起来很尴尬。这样的构造经常在MySQL中使用,但仅作为一种解决方法 - MySQL中的子查询比其他数据库产生更多的开销,因为优化器并不那么复杂。