繁体   English   中英

Group By 中的 AWS Athena ALIAS 未解决

[英]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;

除了来自kokosingGordon Linoff 的答案之外,您还可以使用代表分组列名称在SELECT语句中的位置的数字。 这种方法还可以为您提供更好的性能,如本AWS 博客第 8 节所述。 例如:

SELECT
    substr(accountDescriptor, 5) as account,
    sum(revenue) as grossRevenue
FROM sales,
GROUP BY 1

注意:编号从一开始而不是从零开始。

这里1account有点别名。 主要明显的缺点是,如果您在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM