在select中的group by的最后一个条目,用上一个已知值替换null

时间:2014-09-17 20:43:54

标签: mysql join intervals

我的数据库是在mysql中 我想要实现一些事情。我有两个时间序列数据。一个记录间隔15分钟,另一个记录值发生变化时记录。我想加入这两张桌子 所需的表格为3列,{time_stamp,table1.value,table2.value}和与table1相同的行数
1)table1.value只保留它的价值 2)table2.value列在表1的time_stamp之前的15分钟内具有表2中的最后一个值 3)如果table2.value为null,则保留最后的已知值

我试图离开加入这两张桌子并尝试做" group by" time_stamp并尝试从" group by"获取最新条目。没有成功。 我还试图在结果列中替换空值 "使用@n:= COALESCE(table2.value,@ n)"。 我认为它没有用,因为加入的结果不合适。我试图在查询结束时添加订单也没有成功..

这可以在一个查询中实现吗?感谢任何帮助!

表1

+---------------------------------------+
|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        |
+---------------------------+-----------+

result_table

+---------------------------------------+----------+
|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        |
+---------------------------+-----------+----------+

1 个答案:

答案 0 :(得分:1)

您可以在值列表中使用subselect:

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;