在其他postgresql DBMSes (例如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上做同样的事情时,我得到了错误的"Column total_sales I not exist...“它不是,这是正确的;它不是一个真正的列。但是,有没有办法保留这种习惯用法,而不是重构查询呢?我这么问是因为会有很多代码需要修改。
谢谢。
发布于 2017-06-02 13:29:25
就我个人而言,我喜欢netezza中的结构。这是紧凑的,语法没有歧义:在当前查询中,任何“dublicate”列名都将默认为(new)别名,如果需要引用底层表的列,只需将表名放在列的前面。上面的示例将变成:
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年或更长时间
https://stackoverflow.com/questions/44289591
复制相似问题