mysql:长时间整合一个表的值

标签 mysql sql

我想将 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 列的差异。反过来,这取决于列的数据类型,这在问题中没有指定。

最后,您的子查询有一个致命的缺陷。它有 columnsselect 中不在 group by 中。这使用了文档明确警告不要使用的扩展分组。

关于mysql:长时间整合一个表的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24058463/

相关文章:

mysql - SQL 按一定顺序查找具有两个历史记录的所有用户

sql - 在 MySQL 中归档父/子表层次结构

sql - 关于重复数据删除软件的建议?

php - SQL从多个表中选择并按一定条件排序

sql - count(索引列)比count(*)快吗?

mysql - 提高查询性能

mysql - 如何使用jpa在mysql中存储java对象?

sql - 无法使用下一条记录中的同一列更新表错误 1093

mysql - Mysql单查询统计多表数据

sql - 将 sql 查询输出以 "for-each"样式提供给新的 sql