首页 > 解决方案 > 如何将先前值复制到另一列

问题描述

我有一个 Postgres 数据库,其中包含大量数据,包括模式和所有数据库属性。我想创建从之前收盘价拉到相同符号的开盘价。

我的数据是这样的:

ID  DATE        SYMBOL      OPEN    CLOSE
1   1.01.2020   ABC                  2,33
2   1.01.2020   XYZ                 10,32
3   1.01.2020   KLM                 30,33
4   1.01.2020   DEF                 50,78
5   3.01.2020   ABC                  3,00
6   3.01.2020   KLM                 31,00
7   4.01.2020   ABC                  4,00
8   4.01.2020   XYZ                 13,00
9   4.01.2020   KLM                 25,00
10  4.01.2020   DEF                 48,00
11  5.01.2020   XYZ                 11,50
12  5.01.2020   DEF                 47,53
13  7.01.2020   ABC                  4,58
14  7.01.2020   XYZ                 12,54
15  7.01.2020   KLM                 25,78
16  7.01.2020   DEF                 48,33

我创建了开放列,它应该具有以前的符号价格。

我的期望输出:

ID  DATE        SYMBOL      OPEN    CLOSE
1   01.01.2020  ABC                  2,33
2   01.01.2020  XYZ                 10,32
3   01.01.2020  KLM                 30,33
4   01.01.2020  DEF                 50,78
5   03.01.2020  ABC          2,33    3,00
6   03.01.2020  KLM         30,33   31,00
7   04.01.2020  ABC          3,00    4,00
8   04.01.2020  XYZ         10,32   13,00
9   04.01.2020  KLM         31,00   25,00
10  04.01.2020  DEF         50,78   48,00
11  05.01.2020  XYZ         13,00   11,50
12  05.01.2020  DEF         48,00   47,53
13  07.01.2020  ABC          4,00    4,58
14  07.01.2020  XYZ         11,50   12,54
15  07.01.2020  KLM         25,00   25,78
16  07.01.2020  DEF         47,53   48,33

开盘价 = 前收盘价 ABC 01.01.2020 收盘价 2,33 = ABC 03.01.2020 开盘价 2,33

我的数据库处于活动状态,并且每天都在获取新数据,这应该是 OPEN 列必须用(相同的符号)之前的收盘价数据填充。

所有符号在某一天都没有价格,此时它的价格已超过 100.000+ 列。我用 sql 查询尝试了一些东西,但没有弄清楚。作为数据库查询,我很友好。据我所知,文档有以下定义

那么这可能吗?如果是这样,怎么做?提前致谢..

标签: sqldatabasepostgresql

解决方案


我想你只是想要lag()

select t.*,
       lag(close) over (partition by symbol order by date) as prev_close
from t;

如果要更新表中的值,可以使用join(添加列后):

update t
    set open = tt.prev_close
    from (select t.*,
                 lag(close) over (partition by symbol order by date) as prev_close
          from t
         ) tt
    where tt.id = t.id and
          tt.prev_close is distinct from t.open;

推荐阅读