未解析group by中的aws athena别名

ldioqlga  于 2021-06-25  发布在  Hive
关注(0)|答案(3)|浏览(546)

我在雅典娜有一个非常基本的groupby查询,我想用一个别名。我们可以通过将相同的引用放在groupby中来实现这个示例,但是当需要对列进行复杂的修改并且需要在两个地方复制逻辑时,这并不是很方便。我以前也这样做过,现在我有一个声明,复制过来是行不通的。
问题:

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

这将引发一个错误:
无法解析别名列“account”
下面是关于别名处理的工作原理。

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

klh5stk11#

配置单元中不允许列别名 GROUP BY --正如sql标准不允许那样。有些数据库扩展sql以允许别名,但这是一个扩展。
重复这个表达:

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

uplii1fm2#

除了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
ahy6op9u

ahy6op9u3#

这是因为sql是按一定顺序计算的,比如表扫描、过滤、聚合、投影、排序。您尝试使用投影的结果作为聚合的输入。在许多情况下,这是可能的(在投影是琐碎的情况下,就像您的案例),但这种行为并没有在ansisql中定义(presto和athena紧随其后)。
我们看到,在许多情况下,它是非常有用的,因此,对它的支持可能会在将来添加(扩展ansisql)。
目前,有几种方法可以克服这一问题:

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;

相关问题