gpt4 book ai didi

sql - 窗口函数字段的别名在 HAVING 和 WHERE 子句中使用时导致 "not found"错误

转载 作者:行者123 更新时间:2023-12-04 13:40:33 25 4
gpt4 key购买 nike

考虑以下 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 中的错误吗?或者我的查询中还有其他错误吗?

可能相关:
  • Mysterious error when combining lead function, second window function and column alias
  • https://code.google.com/p/google-bigquery/issues/detail?id=336&q=window%20alias

  • 一种解决方法是将其转换为子查询并移动 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

    最佳答案

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

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

    顺便说一句,HAVING没有条款 GROUP BY看起来很尴尬。这种结构经常在 MySQL 中使用,但只是作为一种变通方法——MySQL 中的子查询比其他数据库中的子查询产生更多的开销,因为优化器并不那么复杂。

    关于sql - 窗口函数字段的别名在 HAVING 和 WHERE 子句中使用时导致 "not found"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35042159/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com