在表中减去同一列的两个记录

时间:2012-06-22 09:54:39

标签: sql postgresql window-functions

我正在使用PostgreSQL,我想减去同一个表的两个记录,并在同一个查询中使用结果。

这是表格:

得分

6
8
9


结果

6
   2
   1

我想做什么:

Result = Score(i) - Score(i-1)

最后,我想要这些结果的总和。 <{1}}在我的例子中必须是9。

2 个答案:

答案 0 :(得分:5)

您需要某种方法来确定score中的行序列。关系数据库中的表中没有“自然顺序”。所以我假设您有一个id(或时间戳或其他东西)来订购您的记录。或者i保证在每个新行中都更大?然后您可以按i订购。

查询本身很简单 - 一旦您发现window functions

SELECT i - lag(i, 1, 0) OVER (ORDER BY id) AS result
FROM   score
ORDER  BY id;

包括@Clodoaldo的改进(见评论)。

lag(i, 1, 0) OVER (ORDER BY id)

相当于,但更优雅:

COALESCE(lag(i) OVER (ORDER BY id), 0)

目的是涵盖没有前一行的第一行的特殊情况 Demo on sqlfiddle.

sum(result)是微不足道的,因为根据您的描述它必然等于最后i

SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;

答案 1 :(得分:0)

这样的东西
SELECT SUM(COALESCE(rx.diff,rx.val))
  FROM
(SELECT x.val,
        x.val - lag(x.val) over () as diff
  FROM (SELECT unnest(ARRAY[6,8,9]) as val) AS x) AS rx

替换你的表格选择我自己的,根据你的例子生成数据。