减去表中同一列的两条记录

Posted

技术标签:

【中文标题】减去表中同一列的两条记录【英文标题】:Subtract two records of the same column in a table 【发布时间】:2012-06-22 09:54:39 【问题描述】:

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

这是表格:

分数

6 8 9


结果

6 2 1

我想做什么:

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

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

【问题讨论】:

【参考方案1】:

您需要一些方法来确定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 但是使用lag(i, 1, 0) 代替coalesce 不是更好吗? @Clodoaldo:我同意,这更简单。用你的想法更新了答案。 @ErwinBrandstetter 非常感谢您的解释,但我的意思是总和是列结果的总和,所以这里是 6 + 2 + 1 给出 9 但巧合与上次相同分数的价值谢谢 @Lily:根据您的描述,这不是巧合而是逻辑结果。如果您有不同的结果,请提供另一个示例。【参考方案2】:

类似

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,它只是根据你的例子生成数据。

【讨论】:

感谢您的评论,但是如果我想要一个我不知道它是条目的表格或者它有无限条目,这意味着我不能将数组放在这种表格中,我该怎么办?还是不可能做到这一点? @Lily:Gavin 示例中的数组显然只是为了提供示例值,而不是您的解决方案的一部分。但是,缺少的一件事是ORDER BY 子句。没有它,lag() 的结果是(特定于实现的)任意的。另外,COALESCE 放错地方了。

以上是关于减去表中同一列的两条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何用通配符比较同一张表中的两条记录?

请问如何使用SQL语句查询同一张表中互为相反数的两条记录!如A1=500,A2=-500,如何写SQL语句

是否有在 sql 表中的两条记录之间添加新记录的语法?

如何为mysql中的每条记录检索表中的两条记录

如何合并 MySQL 表中的两条冗余记录,维护所有 PK/FK 关系?

python 将同一借据号对应的两条紧急联系人信息组装成一条记录