参考 Amazon Redshift 查询中的聚合结果?
Posted
技术标签:
【中文标题】参考 Amazon Redshift 查询中的聚合结果?【英文标题】:Refer to aggregate result in Amazon Redshift query? 【发布时间】:2017-05-31 16:03:39 【问题描述】:在其他 postgresql DBMS(例如 Netezza)中,我可以做这样的事情而不会出错:
select store_id
,sum(sales) as total_sales
,count(distinct(txn_id)) as d_txns
,total_sales/d_txns as avg_basket
from my_tlog
group by 1
也就是说,我可以在定义它们的同一 SQL 查询中使用聚合值。
但是,当我在 Amazon Redshift 上做同样的事情时,我收到错误“列 total_sales 不存在...”它不存在,这是正确的;这不是一个真正的专栏。但是有没有办法保留这个习语,而不是重组查询?我问是因为会有很多代码要更改。
谢谢。
【问题讨论】:
【参考方案1】:您只需重复表达式(或使用子查询或 CTE):
select store_id,
sum(sales) as total_sales,
count(distinct txn_id) as d_txns,
sum(sales)/count(distinct txn_id) as avg_basket
from my_tlog
group by store_id;
大多数数据库不支持在select
中重复使用列别名。原因有两个(至少):
from
子句中表中的有效列时会产生歧义。
【讨论】:
这些都是合理的设计考虑。我想我希望像#pragma 这样可以将谨慎抛诸脑后。相反,我只会让代码更主流。【参考方案2】:我个人喜欢 netezza 中的构造。这很紧凑,语法也没有歧义:在当前查询中,任何“重复”的列名都将默认为(新)别名,如果您需要引用基础表的列,只需将表名放在列的前面.上面的例子会变成:
select store_id
,sum(sales) as sales ---- dublicate name
,count(distinct(txn_id)) as d_txns
,my_tlog.sales/d_txns as avg_basket --- this illustrates but may not make sense
from my_tlog
group by 1
我最近离开了 sql server,在那个数据库上我使用了这样的结构来避免重复表达式:
Select *, total_sales/d_txns as avg_basket
From (
select store_id
,sum(sales) as total_sales
,count(distinct(txn_id)) as d_txns
from my_tlog
group by 1
)x
大多数(如果不是全部)数据库将支持这种结构,并且已经这样做了 10 年或更长时间
【讨论】:
以上是关于参考 Amazon Redshift 查询中的聚合结果?的主要内容,如果未能解决你的问题,请参考以下文章
在 Amazon Redshift 中使用窗口函数时需要 GROUP BY 聚合
Redshift 中的 DAU WAU MAU 错误:[Amazon](500310) 无效操作:由于内部错误,不支持此类关联子查询模式;