我正在使用PostgreSQL,我想减去同一个表的两个记录,并在同一个查询中使用结果。
这是表格:
6
8
9
6
2
1
我想做什么:
Result = Score(i) - Score(i-1)
最后,我想要这些结果的总和。 <{1}}在我的例子中必须是9。
答案 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
替换你的表格选择我自己的,根据你的例子生成数据。