Sql Postgres窗口函数新表保存
我的数据是这样的 表ASql Postgres窗口函数新表保存,sql,postgresql,window-functions,alter-table,Sql,Postgresql,Window Functions,Alter Table,我的数据是这样的 表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
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
我有一个窗口函数,它获取运行平均值并附加一列
选择账户id,值,“时间戳”,
平均值(值)(按帐户划分\u id顺序按“时间戳”)作为平均值
从桌子上
按帐户id订购,“时间戳”;
并输出此表
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
我认为这样做的一个方法是:
(开始伪代码)
您能告诉我postgresql语句是什么样子吗?您可以添加一个新列,然后按如下方式更新它:
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";
这假设(account\u id,timestamp)
元组在整个表中是唯一的。我实现了这一点
BEGIN;
DROP TABLE IF EXISTS temp;
SELECT account_id, value, TO_TIMESTAMP(timestamp, 'YYYY-MM-DD HH24:MI:SS'),
avg(CAST(value as FLOAT)) over (partition by account_id order by "timestamp") as average
INTO temp
from volume_temp
order by account_id, "endts";
ALTER TABLE volume_temp RENAME TO volume_temp_old;
ALTER TABLE temp RENAME TO volume_temp;
DROP TABLE IF EXISTS temp;
DROP TABLE IF EXISTS volume_temp_old;
COMMIT;
经过一些工作,我得到了上述工作,但我实际上做了一个更规范的方式。所以我只是创建了一个名为vol_stats的新表,从另一个表中引入pk并将其命名为fk 然后,我将把两张桌子连接在一起,而不是一张大桌子 这是我的sql
BEGIN;
DROP TABLE IF EXISTS vol_stats;
SELECT pk as fk,
avg(CAST(volume as FLOAT)) over (partition by account_id order by "endts") as average,
count(endts) over (partition by account_id order by "endts") as count,
stddev(CAST(volume as FLOAT)) over (partition by account_id order by "endts") as standard_deviation,
variance(CAST(volume as FLOAT)) over (partition by account_id order by "endts") as var,
sum(CAST(volume as FLOAT)) over (partition by account_id order by "endts") as running_sum,
CAST(volume as FLOAT)/CAST(average as FLOAT) as vta
INTO vol_stats
from volume_temp
order by account_id, "endts";
COMMIT;
表的主键是什么?
BEGIN;
DROP TABLE IF EXISTS vol_stats;
SELECT pk as fk,
avg(CAST(volume as FLOAT)) over (partition by account_id order by "endts") as average,
count(endts) over (partition by account_id order by "endts") as count,
stddev(CAST(volume as FLOAT)) over (partition by account_id order by "endts") as standard_deviation,
variance(CAST(volume as FLOAT)) over (partition by account_id order by "endts") as var,
sum(CAST(volume as FLOAT)) over (partition by account_id order by "endts") as running_sum,
CAST(volume as FLOAT)/CAST(average as FLOAT) as vta
INTO vol_stats
from volume_temp
order by account_id, "endts";
COMMIT;