sup*_*ova 4 sql alias hive presto amazon-athena
我在 Athena 中有一个非常基本的 group by query,我想在其中使用别名。可以通过在 group by 中放置相同的引用来使示例工作,但是当存在复杂的列修改并且需要在两个地方复制逻辑时,这并不是很方便。我过去也这样做过,现在我有一个通过复制不起作用的声明。
问题:
SELECT
substr(accountDescriptor, 5) as account,
sum(revenue) as grossRevenue
FROM sales
GROUP BY account
Run Code Online (Sandbox Code Playgroud)
这将引发错误:
别名列“帐户”无法解析
以下工作,所以它是关于别名处理。
SELECT
substr(accountDescriptor, 5) as account,
sum(revenue) as grossRevenue
FROM sales
GROUP BY substr(accountDescriptor, 5)
Run Code Online (Sandbox Code Playgroud)
Ily*_*sil 10
除了kokosing和Gordon Linoff的答案之外,您还可以使用表示分组列名称在SELECT语句中的位置的数字。这种方法还可以为您提供更好的性能,如本AWS 博客第 8 节所述。例如:
SELECT
substr(accountDescriptor, 5) as account,
sum(revenue) as grossRevenue
FROM sales,
GROUP BY 1
Run Code Online (Sandbox Code Playgroud)
注意:编号从 1 开始,而不是从 0 开始。
这里1有点别名为account. 主要的明显缺点是,如果您更改其中列的顺序SELECT,那么您还需要考虑以下内容GROUP BY:
SELECT
sum(revenue) as grossRevenue,
substr(accountDescriptor, 5) as account
FROM sales,
GROUP BY 2
Run Code Online (Sandbox Code Playgroud)
那是因为 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
Run Code Online (Sandbox Code Playgroud)
或者
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
Run Code Online (Sandbox Code Playgroud)
或者
SELECT account, sum(revenue) as grossRevenue
FROM sales
LATERAL JOIN (SELECT substr(accountDescriptor, 5) as account)
GROUP BY account
Run Code Online (Sandbox Code Playgroud)
或者
SELECT substr(accountDescriptor, 5) as account, sum(revenue) as grossRevenue
FROM sales
GROUP BY 1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3293 次 |
| 最近记录: |