我希望将v值与t的timediffs从一行集成到下一行,在这样的表中:“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:
的timediff进行整合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 |
+---------+
但我不确定这是否是最有效的方法。
感谢。
答案 0 :(得分:2)
如果您认为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
列的差异。反过来,这取决于列的数据类型,这在问题中没有指定。
最后,你的子查询有一个致命的缺陷。 select
中的columns group by
不在{{1}}中。这使用了一个扩展组,文档明确警告不要使用。
答案 1 :(得分:1)
select sum(value)
from
(select (p.v*(t-@prev)) as value,
@prev:=t
from (select @prev:=0) sess, p_values p
order by p.measure_id desc) raw
这里我们介绍一个变量@prev,我们存储上一行的值(但我们按desc顺序排序)。
然后只是总结结果
小提琴的UPDATE查询
select sum(value)
from
(select (p.v*(t-@prev)) as value,
@prev:=v
from (select @prev:=0) sess, p_values p
order by v desc) raw