分组依据中的 AWS Athena 别名无法解析



我在雅典娜中有一个非常基本的查询组,我想在其中使用别名。可以通过在分组依据中放置相同的引用来使示例工作,但是当正在进行复杂的列修改并且需要在两个地方复制逻辑时,这并不方便。我过去也这样做过,现在我有一个通过复制不起作用的语句。

问题:

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 开始,而不是从零开始。

在这里,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);

相关内容

  • 没有找到相关文章

最新更新