我使用PostgreSQL中的每日时间序列。 我的目标是在我的表中添加一个新变量,该变量计算同一公司的两个相邻日期的某个列的值之间的差异。 (你可以考虑增长率)
我们可以想到以下示例数据:
date company value
2012-01-01 A 5
2012-01-01 B 2
2012-01-01 C 3
2012-01-02 A 4
2012-01-02 B 2
2012-01-02 C 4
2012-01-03 A 7
2012-01-03 B 2
2012-01-03 C 2
我想达到的最佳结果是:
date company value diff
2012-01-01 A 5 NULL
2012-01-01 B 2 NULL
2012-01-01 C 3 NULL
2012-01-02 A 4 -1
2012-01-02 B 2 0
2012-01-02 C 4 1
2012-01-03 A 7 3
2012-01-03 B 2 0
2012-01-03 C 2 -2
我尝试了以下(可能非常繁琐)的方法:
添加了一个自动增量主键来标识每一行
CREATE SEQUENCE id_seq;
ALTER TABLE mytable ADD id INT UNIQUE;
ALTER TABLE mytable ALTER COLUMN id SET DEFAULT NEXTVAL('id_seq');
UPDATE mytable SET id = NEXTVAL('id_seq');
ALTER TABLE mytable ADD PRIMARY KEY (id);
以下列方式计算差异:
CREATE TABLE change AS WITH d AS (SELECT value, id FROM temp)
SELECT d.value - d2.value AS change FROM d d
JOIN d d2 ON d.id = d2.id + 1;
不幸的是,代码无法区分不同的公司并计算所有相邻行之间的差异。此外,我不知道如何将它添加到现有表中,因为它没有用NULL填充第一个值但跳过它并从第二行开始,这样得到的表太短了一行。
您能想到找到解决方案的其他有效方法吗?
答案 0 :(得分:3)
您可以使用LEAD()
或LAG()
:
SELECT date
, company
, value
, value - LAG(value,1,0) OVER (PARTITION BY company ORDER BY date) AS Val_Diff
FROM YourTable
每个例子的更多示例:Lag-Lead Analytic Functions