【问题标题】:Refer to aggregate result in Amazon Redshift query?参考 Amazon Redshift 查询中的聚合结果?
【发布时间】: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 不存在...”它不存在,这是正确的;这不是一个真正的专栏。但是有没有办法保留这个习语,而不是重组查询?我问是因为会有很多代码要更改。

谢谢。

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift netezza


    【解决方案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 年或更长时间

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多