2017-05-31 45 views
0

在其他的PostgreSQL的DBMS(例如,Netezza公司),我可以做这样的事情没有错误:请参阅Amazon Redshift查询中的聚合结果?

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 does not exist ...”,但它没有,这是正确的;这不是一个真正的专栏。但是有没有办法保留这个习惯用法,而不是重构查询?我问,因为会有很多代码需要改变。

谢谢。

回答

2

你只需要重复表达式(或使用子查询或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重新使用列别名。原因是双重的(至少):

  • 数据库引擎的设计者不想指定select中处理表达式的顺序。
  • 列别名也是from子句中的表中的有效列时存在歧义。
+0

这些都是合理的设计考虑因素。我想我希望像一个会引起注意的#pragma风。相反,我只是让代码更加主流。 – Chris

1

我个人喜欢netezza中的构造。这是紧凑的,语法并不明确:任何'dublicate'列名在当前查询中都将默认为(新)别名,并且如果您需要引用基础表的列,只需将表名放在列的前面。上面的例子将成为:

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年或更长时间