我正在使用 PostgreSQL,我想减去同一个表的两条记录并在同一个查询中使用结果。
这是表格:
分数
6
8
9
结果
6
2
1
我想做的事:
Result = Score(i) - Score(i-1)
最后,我想要这些结果的总和。sum(result)
在我的示例中必须为 9。
我正在使用 PostgreSQL,我想减去同一个表的两条记录并在同一个查询中使用结果。
这是表格:
6
8
9
6
2
1
我想做的事:
Result = Score(i) - Score(i-1)
最后,我想要这些结果的总和。sum(result)
在我的示例中必须为 9。
您需要一些方法来确定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;
就像是
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,它只是根据您的示例生成数据。