2017-05-31 33 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年或更長時間