Postgres窗口函数新表保存

问题描述 投票:0回答:1

我的数据看起来像这样。

表A

acccount_id | value | timestamp 
-------------------------------
a12         | 122   | jan 1
a13         | 133   | jan 1
a14         | 443   | jan 1
a12         | 251   | jan 2
a13         | 122   | jan 2
a14         | 331   | jan 2
a12         | 412   | jan 3
a13         | 323   | jan 3
a14         | 432   | jan 3

我有一个窗口函数,该函数获取运行平均值并附加一列

select account_id, value, "timestamp", 
       avg(value) over (partition by account_id order by "timestamp") as average
from the_table
order by account_id, "timestamp";

并输出此表。

acccount_id | value | timestamp | Average
-----------------------------------------
a12         |  122  | jan 1     | 122
a13         |  133  | jan 1     | 133
a14         |  443  | jan 1     | 443
a12         |  251  | jan 2     | 188.5
a13         |  122  | jan 2     | 222.5
a14         |  331  | jan 2     | 387
a12         |  412  | jan 3     | 261.6
a13         |  323  | jan 3     | 192.6
a14         |  432  | jan 3     | 402

我的问题是:

如何将新列保存到表A?

我认为做到这一点的一种方法是:

((开始的伪代码)

BEGIN;
SELECT window_function FROM table_a INTO temp
ALTER TABLE table_a RENAME TO table_old;
ALTER TABLE temp RENAME TO table_a;
DROP table_old

COMMIT;

您能告诉我一个postgresql语句是什么样吗?

postgresql psql postgresql-9.1 pgadmin postgresql-9.5
1个回答
0
投票

您可以添加一个新列,然后按如下所示对其进行更新:

alter table the_table add column average decimal(10, 5);

update the_table
set average = t.average
from (
    select 
        account_id, 
        "timestamp", 
        avg(value) over (partition by account_id order by "timestamp") as average
from the_table
) t
where account_id = t.account_id and "timestamp" = t."timestamp";
© www.soinside.com 2019 - 2024. All rights reserved.