sql - 表中同一列的两条记录相减

标签 sql postgresql window-functions

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

这是表格:

分数

6
8
9


结果

6
2
1

我想做的事:

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

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

最佳答案

您需要某种方法来确定 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;

关于sql - 表中同一列的两条记录相减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11153980/

相关文章:

oracle - Last_value 窗口函数不能正常工作

php - 插入查询不起作用,即使它是正确的

sql - 关键字 'UPDATE' 附近的语法不正确

postgresql - Dokku/Docker,如何访问正在运行的容器文件系统中的文件?

sql - Postgres交替组查询

SQL逐月检查ID状态变化

mysql - 设置列等于同一表中另一列的滞后值

PHP MySQL : Unable to Connect to Database

postgresql - 如何将 to_tsvector 与无字典(无词干)一起使用?

在postgresql中使用窗口函数的SQL查询累计总和