我想将 v 值与 t 的时差从一行集成到下一行,在这样的表中:“p_values”=
+------------+-------+----------+
| measure_id | v | t |
+------------+-------+----------+
| 1 | 32 | 10:45:00 |
| 2 | 17 | 10:42:00 |
| 3 | 20 | 10:39:00 |
| 4 | 21 | 10:36:00 |
| 5 | 35 | 10:33:00 |
| 6 | 59 | 10:30:00 |
| 7 | 47 | 10:27:00 |
| 8 | 45 | 10:24:00 |
| 9 | 40 | 10:21:00 |
| 10 | 39 | 10:18:00 |
| 11 | 42 | 10:15:00 |
+------------+-------+----------+
我想将 v 值与 t 的时差相结合:
result = v[1]*(t[1]-t[2]) + v[2]*(t[2]-t[3]) + v[3]*(t[3]-t[4]) + ...
我可以在单个查询上执行此操作吗?
我正在尝试创建一个表,将每一列与下面的列连接起来,如下所示:
select * from
(select measure_id, v, t from p_values order by t desc) a,
(select measure_id, v, t from p_values order by t desc) b
where a.t < b.t group by b.t desc;
+------------+----+----------+------------+----+----------+
| measure_id | v | t | measure_id | v | t |
+------------+----+----------+------------+----+----------+
| 9 | 83 | 11:12:00 | 10 | 25 | 11:15:00 |
| 8 | 90 | 11:09:00 | 9 | 83 | 11:12:00 |
| 7 | 24 | 11:06:00 | 8 | 90 | 11:09:00 |
| 6 | 29 | 11:03:00 | 7 | 24 | 11:06:00 |
| 5 | 72 | 11:00:00 | 6 | 29 | 11:03:00 |
| 4 | 28 | 10:57:00 | 5 | 72 | 11:00:00 |
| 3 | 22 | 10:54:00 | 4 | 28 | 10:57:00 |
| 2 | 42 | 10:51:00 | 3 | 22 | 10:54:00 |
| 1 | 35 | 10:48:00 | 2 | 42 | 10:51:00 |
| 0 | 31 | 10:45:00 | 1 | 35 | 10:48:00 |
+------------+----+----------+------------+----+----------+
根据这个表,我计算单个查询中的积分值为:
select sum(v) from
(select (a.v + b.v)/2 * (TIME_TO_SEC(b.t) - TIME_TO_SEC(a.t))/3600 as v from
(select measure_id, v, t from p_values order by t desc) a,
(select measure_id, v, t from p_values order by t desc) b
where a.t < b.t group by b.t desc) as c;
+---------+
| sum(v) |
+---------+
| 246.948 |
+---------+
但我不确定这是否是最有效的方法。
谢谢。
最佳答案
如果您假设 measure_id
是增量的且没有间隙,那么您可以使用自连接来实现。结果查询是这样的:
select sum(p1.v*(p2.t - p1.t))
from p_values p1 join
p_values p2
on p2.measure_id = p1.measure_id + 1;
一些注意事项。首先,这会忽略最后一个 v
值,因为没有匹配的行。这个问题没有具体说明在这种情况下该怎么做,所以我假设您不希望包括这种差异。
我还留下了时间差异的简单符号。您的问题似乎是关于处理不同行的值,而不是实际计算 time
列的差异。反过来,这取决于列的数据类型,这在问题中没有指定。
最后,您的子查询有一个致命的缺陷。它有 columns在 select
中不在 group by
中。这使用了文档明确警告不要使用的扩展分组。
关于mysql:长时间整合一个表的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24058463/