mysql:长时间整合表的值

时间:2014-06-05 11:01:36

标签: mysql sql

我希望将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 |
+---------+

但我不确定这是否是最有效的方法。

感谢。

2 个答案:

答案 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