2

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

这是表格:

分数

6
8
9


结果

6
2
1

我想做的事:

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

最后,我想要这些结果的总和。sum(result)在我的示例中必须为 9。

4

2 回答 2

5

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

查询本身很简单 - 一旦您了解窗口函数

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)

目的是覆盖第一行没有前行的特殊情况。
sqlfiddle 上的演示。

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

SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;
于 2012-06-22T13:06:28.847 回答
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

将您的表选择替换为我的 unnest,它只是根据您的示例生成数据。

于 2012-06-22T10:43:00.630 回答