【问题标题】:Subtracting one row from another in MySQL在MySQL中从另一行中减去一行
【发布时间】:2014-05-03 17:29:20
【问题描述】:

我看过一些关于如何减去表格中的行的示例,例如: mysql subtract two rows from column and places into an alias

我看到的所有示例都基于具有某种唯一标识符的表,该标识符在每一行上不断增加,例如 ID 列。

我有一个包含日期和多个值的表格。

我拥有的是这样的:

  DATE            EU.1          
  2013-01-01      80 
  2013-01-08      82  
  2013-01-15      71

我想要的是:

  DATE            EU.1        Diff 
  2013-01-01      80          0
  2013-01-08      82          2
  2013-01-15      71         -10

最后,我想创建一个视图来显示最新的 EU.1 值与上一个日期之间的值差异。

【问题讨论】:

  • 当然,你也有一个唯一的标识符。在这种情况下,它是日期......以及价值!

标签: mysql


【解决方案1】:

我非常喜欢为此目的使用相关子查询。在您的情况下,这将被应用为:

select t.*,
       (`EU.1` - (select `EU.1`
                  from table t2
                  where t2.date < t.date
                  order by t2.date desc
                  limit 1
                 )
       ) as diff
from table t;

唯一的区别是第一个值将是NULL 而不是0——这对我来说更有意义。如果你想要0,请在整个表达式周围使用coalesce()

【讨论】:

  • 感谢 Gordon,我已经测试过了,它可以工作。我也试过 Joachim 的,但他的运行时间为 18 秒,而你的运行时间为亚秒。
【解决方案2】:

您可以使用LEFT JOIN。对于每一行,通过确保它们之间没有行来找到前一行;然后减去。

SELECT c.date, c.eu1, COALESCE(c.eu1-a.eu1,0) diff
FROM mytable c
LEFT JOIN mytable a ON a.date < c.date
LEFT JOIN mytable b ON a.date < b.date AND b.date < c.date
WHERE b.date IS NULL;

An SQLfiddle to test with.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多