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