添加新列作为两行之间的差异

时间:2014-02-21 18:14:35

标签: sql postgresql

我使用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

我尝试了以下(可能非常繁琐)的方法:

  1. 添加了一个自动增量主键来标识每一行

    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);
    
  2. 以下列方式计算差异:

    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;
    
  3. 不幸的是,代码无法区分不同的公司并计算所有相邻行之间的差异。此外,我不知道如何将它添加到现有表中,因为它没有用NULL填充第一个值但跳过它并从第二行开始,这样得到的表太短了一行。

    您能想到找到解决方案的其他有效方法吗?

1 个答案:

答案 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