sql - 如何将先前值复制到另一列
问题描述
我有一个 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 查询尝试了一些东西,但没有弄清楚。作为数据库查询,我很友好。据我所知,文档有以下定义
那么这可能吗?如果是这样,怎么做?提前致谢..
解决方案
我想你只是想要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;
推荐阅读
- javascript - 这是在 React 中使用带有承诺的三元 if else 的不好方法吗
- python - 无法理解 boost python 函数导出中的语法
- linux - 如何通过 cscope 查找包含特定文件的文件
- ios - 如何创建圆形 UIImageView
- php - 如何在 php echo 中修复 html
- algorithm - 如何以最小的相邻元素交换对数组进行排序
- python - ValueError:使用参数lines = True在panda中读取json时的预期对象或值
- java - 如何检查字符串以空格开头或结尾
- php - 如何从多个输入文本中获取隐藏值?
- php - 使用一些记录创建文件集