[英]AWS Athena ALIAS in Group By does not get resolved
我在 Athena 中有一个非常基本的 group by query,我想在其中使用别名。 可以通过在 group by 中放置相同的引用来使示例工作,但是当存在复杂的列修改并且需要在两个地方复制逻辑时,这并不是很方便。 我过去也这样做过,现在我有一个通过复制不起作用的声明。
问题:
SELECT
substr(accountDescriptor, 5) as account,
sum(revenue) as grossRevenue
FROM sales
GROUP BY account
这将引发错误:
别名列“帐户”无法解析
以下工作,所以它是关于别名处理。
SELECT
substr(accountDescriptor, 5) as account,
sum(revenue) as grossRevenue
FROM sales
GROUP BY substr(accountDescriptor, 5)
那是因为 SQL 是按特定顺序计算的,如表扫描、过滤、聚合、投影、排序。 您尝试使用投影结果作为聚合的输入。 在许多情况下这是可能的(其中投影是微不足道的,就像你的情况一样),但这种行为没有在 ANSI SQL 中定义(Presto 和 Athena 遵循)。
我们看到在许多情况下它非常有用,因此将来可能会添加对此的支持(扩展 ANSI SQL)。
目前,有几种方法可以克服这个问题:
SELECT account, sum(revenue) as grossRevenue
FROM (SELECT substr(accountDescriptor, 5) as account, revenue FROM sales)
GROUP BY account
或者
WITH better_sales AS (SELECT substr(accountDescriptor, 5) as account, revenue FROM sales)
SELECT account, sum(revenue) as grossRevenue
FROM better_sales
GROUP BY account
或者
SELECT account, sum(revenue) as grossRevenue
FROM sales
LATERAL JOIN (SELECT substr(accountDescriptor, 5) as account)
GROUP BY account
或者
SELECT substr(accountDescriptor, 5) as account, sum(revenue) as grossRevenue
FROM sales
GROUP BY 1;
除了来自kokosing和Gordon Linoff 的答案之外,您还可以使用代表分组列名称在SELECT
语句中的位置的数字。 这种方法还可以为您提供更好的性能,如本AWS 博客第 8 节所述。 例如:
SELECT
substr(accountDescriptor, 5) as account,
sum(revenue) as grossRevenue
FROM sales,
GROUP BY 1
注意:编号从一开始而不是从零开始。
这里1
与account
有点别名。 主要明显的缺点是,如果您在SELECT
更改列的顺序,那么您还需要在GROUP BY
:
SELECT
sum(revenue) as grossRevenue,
substr(accountDescriptor, 5) as account
FROM sales,
GROUP BY 2
Hive 不允许在GROUP BY
使用列别名——就像 SQL 标准不允许它们一样。 一些数据库扩展 SQL 以允许别名,但这是一个扩展。
只需重复表达:
SELECT substr(accountDescriptor, 5) as account, sum(revenue) as grossRevenue
FROM sales
GROUP BY substr(accountDescriptor, 5);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.