参考 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) 无效操作:由于内部错误,不支持此类关联子查询模式;

使用 Amazon Redshift / PostgreSQL 进行漏斗查询

同时对 Amazon Redshift 和本地源运行查询

Amazon Redshift - 清理和分析详细信息

与 Amazon Redshift 同步