Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres窗口函数新表保存_Sql_Postgresql_Window Functions_Alter Table - Fatal编程技术网

Sql Postgres窗口函数新表保存

Sql 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

我的数据是这样的

表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
我有一个窗口函数,它获取运行平均值并附加一列

选择账户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;