SQL - 将avg列添加到详细信息表

时间:2016-02-03 18:41:19

标签: sql average teradata

我在Teradata。我有一个如下的订单表。

 custID | orderID | month | order_amount
-----------------------------------------
    1   |    1    |  jan  |      10
    1   |    2    |  jan  |      20
    1   |    3    |  feb  |       5
    1   |    4    |  feb  |       7
    2   |    5    |  mar  |      20
    2   |    6    |  apr  |      30

我想在上表中添加一个名为“每个客户每月平均订单金额”的列。由于表格处于订单级别,因此添加此列将导致重复,如下所示,这是可以的。

 custID | orderID | month | order_amount | avgOrdAmtperMonth
-------------------------------------------------------------
    1   |    1    |  jan  |      10      |       15
    1   |    2    |  jan  |      20      |       15
    1   |    3    |  feb  |       5      |        6
    1   |    4    |  feb  |       7      |        6
    2   |    5    |  mar  |      20      |       20
    2   |    6    |  apr  |      30      |       30

我希望输出包含上面的所有列,而不仅仅是custid和新列。我不知道如何写这个,因为表的一部分是订单级别,新列需要按客户+月分组。我该怎么做?

2 个答案:

答案 0 :(得分:3)

这是一个简单的组平均值

AVG(order_amount) OVER (PARTITION BY custID, month)

答案 1 :(得分:3)

为什么不在查询表时进行计算?

select t.*,
       avg(order_amount) over (partition by custId, month) as avgOrderAmtPerMonth
from t;

如果要将其添加到多个下游查询中,可以将其添加到视图中。

实际上,将列添加到表中是一项维护"噩梦"。您必须向表中添加触发器并更新更新,插入和删除的值。