mysql - select 中分组依据的最后一个条目,将 null 替换为最后一个已知值

标签 mysql join intervals

我的数据库是mysql。
我正在努力实现一些目标。我有两个时间序列数据。一个以 15 分钟的间隔记录,另一个在值发生变化时记录。我正在尝试连接这两个表。
所需的表将是 3 列,{time_stamp, table1.value, table2.value} 和与 table1 相同的行数
1) table1.value 只是保持它的值。
2) table2.value 列在 table1 的 time_stamp 之前 15 分钟内具有来自表 2 的最后一个值
3) 如果 table2.value 为 null,则保留最后一个已知值

我试图左连接两个表并尝试执行“分组依据”time_stamp 并尝试从“分组依据”获取最新条目但没有成功。 我还尝试替换结果列中的空值
“使用@n := COALESCE(table2.value,@n)”。 我认为它没有用,因为加入的结果没有按顺序排列。我尝试在查询末尾添加 order by 也没有成功..

这是否可以通过一个查询来实现?感谢任何帮助!

表一

+---------------------------------------+
|time                       | value     |
+---------------------------+-----------+
|'2014-09-15 06:15:02.1500' | 71        |
|'2014-09-15 06:30:02.1500' | 72        |
|'2014-09-15 06:45:02.1500' | 73        |
|'2014-09-15 07:00:02.1500' | 74        |
|'2014-09-15 07:15:02.1500' | 75        |
|'2014-09-15 07:30:02.1500' | 76        |
|'2014-09-15 07:45:02.1500' | 77        |
+---------------------------+-----------+

表2

+---------------------------------------+
|time                       | value     |
+---------------------------+-----------+
|'2014-09-15 06:14:02.1500' | 30        |
|'2014-09-15 06:15:02.1500' | 55        |
|'2014-09-15 06:18:02.1500' | 60        |
|'2014-09-15 06:20:02.1500' | 62        |
|'2014-09-15 06:23:02.1500' | 35        |
|'2014-09-15 07:36:02.1500' | 45        |
|'2014-09-15 07:38:02.1500' | 36        |
|'2014-09-15 07:40:02.1500' | 87        |
+---------------------------+-----------+

结果表

+---------------------------------------+----------+
|time                       |table1.val |table2.val|                  
+---------------------------+-----------+----------+
|'2014-09-15 06:15:02.1500' | 71        |30        |
|'2014-09-15 06:30:02.1500' | 72        |35        |
|'2014-09-15 06:45:02.1500' | 73        |35        |
|'2014-09-15 07:00:02.1500' | 74        |35        |
|'2014-09-15 07:15:02.1500' | 75        |35        |
|'2014-09-15 07:30:02.1500' | 76        |35        |
|'2014-09-15 07:45:02.1500' | 77        |87        |
+---------------------------+-----------+----------+

最佳答案

为此,您可以在值列表中使用子选择:

select time, value as t1value,
coalesce(@val := (
    select value from table2
    where time < table1.time
        AND time >= table1.time - INTERVAL 15 MINUTE
    order by time desc limit 1
), @old) as t2value, @old := @val from table1;

关于mysql - select 中分组依据的最后一个条目,将 null 替换为最后一个已知值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25900030/

相关文章:

mysql - 选择所有连接行都匹配的记录

MySQL 多个值连接到一个表 - 更好的查询?

angularjs - 暂停一个 Angular 间隔,然后恢复

php - 在 MySQL 数据库中搜索多列的特定语法?

php - 将月份和日期与当前日期进行比较

mysql - 通过使用子日期获取前一天在自定义列中计算

r - 按段数 (R) 分隔相交时间间隔

javascript - 具有在运行时更改的参数的超时函数

mysql - ERD 中不共享任何外键的数据库表之间的关系

php - 与 Doctrine 相关的实体返回所有字段值 NULL