MySQL使用前面的字段减去字段

MySQL使用前面的字段减去字段,sql,mariadb,subtraction,Sql,Mariadb,Subtraction,我想减去两个值,当前值和每个值的当前值之前的行中的值,基本上创建一个只包含这些新值的新表,以便稍后对它们进行平均 表结构如下所示: ----------------------- id | keyTime | millis| ------------------------ 1 | 22:00:00 | 10 | 2 | 22:05:00 | 20 | 3 | 22:10:00 | 30 | 4 | 22:15:00 | 40 | 我想这样减去: ------

我想减去两个值,当前值和每个值的当前值之前的行中的值,基本上创建一个只包含这些新值的新表,以便稍后对它们进行平均

表结构如下所示:

-----------------------
id | keyTime   | millis| 
------------------------
1  | 22:00:00  | 10  | 
2  | 22:05:00  | 20  |
3  | 22:10:00  | 30  | 
4  | 22:15:00  | 40  |
我想这样减去:

-----------------------
id | keyTime   | millis| 
------------------------
1  | 22:00:00  | 10  | 
2  | 22:05:00  | 20  |
3  | 22:10:00  | 30  | 
4  | 22:15:00  | 40  |

您可以使用相关子查询:

select t.*, (millis - coalesce(prev_millis, 0)) as diff
from (select t.*,
             (select t2.millis
              from t t2
              where t2.keyTime < t.keyTime
              order by t2.keyTime desc
              limit 1
             ) as prev_millis
      from t
     ) t;

这假定id不可靠。通过显示的id值,您可以简单地使用左联接。

您可以使用相关子查询:

select t.*, (millis - coalesce(prev_millis, 0)) as diff
from (select t.*,
             (select t2.millis
              from t t2
              where t2.keyTime < t.keyTime
              order by t2.keyTime desc
              limit 1
             ) as prev_millis
      from t
     ) t;

这假定id不可靠。根据您显示的id值,您可以简单地使用左连接。

如果您的id始终是连续的,那么左连接将是最佳解决方案

SELECT `t`.`id`,`t`.`millis`-COALESCE(`t2`.`millis`,0) AS `diff`
FROM `t`
LEFT JOIN `t` AS `t2` ON `t2`.`id` = `t`.`id`-1
否则,我将使用子查询

SELECT `id`,`millis` - COALESCE((SELECT `millis` FROM `t` AS `t2` WHERE `id` < `t`.`id` ORDER BY `id` DESC LIMIT 1),0) AS `diff`
FROM `t`

我认为如果你的ID总是连续的,左连接将是最好的解决方案

SELECT `t`.`id`,`t`.`millis`-COALESCE(`t2`.`millis`,0) AS `diff`
FROM `t`
LEFT JOIN `t` AS `t2` ON `t2`.`id` = `t`.`id`-1
否则,我将使用子查询

SELECT `id`,`millis` - COALESCE((SELECT `millis` FROM `t` AS `t2` WHERE `id` < `t`.`id` ORDER BY `id` DESC LIMIT 1),0) AS `diff`
FROM `t`

在MySQL 8.x中,可以使用LAG函数。你有MySQL 8.x还是旧的5.x?10.1.37 MariadBy你需要MariaDB 10.2来使用LAG。您最好使用另一种解决方案,例如Gordon的。在MySQL 8.x中,您可以使用LAG函数。你有MySQL 8.x还是旧的5.x?10.1.37 MariadBy你需要MariaDB 10.2来使用LAG。你最好用另一种解决方案,比如戈登的。回答得好。我从未想过在表表达式中使用LIMIT。我需要把它输入我的大脑。这就像MySQL在默认情况下有横向表表达式一样。@TheImpler。横向联接是相关子查询的泛化。后者从一开始就使用SQL。回答得好。我从未想过在表表达式中使用LIMIT。我需要把它输入我的大脑。这就像MySQL在默认情况下有横向表表达式一样。@TheImpler。横向联接是相关子查询的泛化。后者从一开始就使用SQL。