MySQL 用前面的字段减去字段
MySQL subtract field with the field before
我想减去两个值,即当前值,以及每个值当前值之前的行中的值,基本上只用这些新值创建一个新的 table,以便我可以对它们进行平均晚了。
Table 结构如下所示:
-----------------------
id | keyTime | millis|
------------------------
1 | 22:00:00 | 10 |
2 | 22:05:00 | 20 |
3 | 22:10:00 | 30 |
4 | 22:15:00 | 40 |
我想这样减去:
id | dif |
-------------
1 | 10-0 |
2 | 20-10 |
3 | 30-20 |
4 | 40-30 |
您可以使用相关子查询:
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
值,您可以简单地使用 left join
.
我认为左连接是最好的解决方案(如果您的 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`
我想减去两个值,即当前值,以及每个值当前值之前的行中的值,基本上只用这些新值创建一个新的 table,以便我可以对它们进行平均晚了。
Table 结构如下所示:
-----------------------
id | keyTime | millis|
------------------------
1 | 22:00:00 | 10 |
2 | 22:05:00 | 20 |
3 | 22:10:00 | 30 |
4 | 22:15:00 | 40 |
我想这样减去:
id | dif |
-------------
1 | 10-0 |
2 | 20-10 |
3 | 30-20 |
4 | 40-30 |
您可以使用相关子查询:
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
值,您可以简单地使用 left join
.
我认为左连接是最好的解决方案(如果您的 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`