根据时间和ID加入表

时间:2016-06-22 22:38:56

标签: mysql

我有两个时间序列数据表,我试图查询,不知道如何正确地执行此操作。

第一个表是设备测量的时间序列数据。每个设备都与一个源关联,数据包含每小时测量。在这个例子中,有5个设备(101-105),数据为5天(6月1日至5日)。

device_id      date_time    source_id  meas
101        2016-06-01 00:00   ABC       105
101        2016-06-01 01:00   ABC       102
101        2016-06-01 02:00   ABC       103
...
101        2016-06-05 23:00   ABC       107
102        2016-06-01 00:00   XYZ       102
...
105        2016-06-05 23:00   XYZ       104

第二个表是源测量的时间序列数据。每个来源都有三个小时测量值(meas_1,meas_2和meas_3)。

source_id      date_time     meas_1  meas_2  meas_3
ABC        2016-06-01 00:00   100     101     102
ABC        2016-06-01 01:00   99      100     105
ABC        2016-06-01 02:00   104     108     109
...
ABC        2016-06-05 23:00   102     109     102
XYZ        2016-06-01 00:00   105     106     103
...
XYZ        2016-06-05 23:00   103     105     101

我正在寻找一个查询来获取指定日期范围的数据,该日期范围可以获取设备的测量值及其相关源的测量值。此示例是从6月2日到4日查询设备101的结果。

device_id      date_time     d.meas  s.meas_1  s.meas_2  s.meas_3
101        2016-06-02 00:00   105        100       101       102
101        2016-06-02 01:00   102        99        100       105
101        2016-06-02 02:00   103        104       108       109
...
101        2016-06-04 23:00   107        102       109       102

实际数据集可能会变大,假设100,000个设备和90天的每小时测量。因此,任何有关正确索引表格的帮助都将受到赞赏。我正在使用MySQL。

更新 - 已解决

这是我使用的查询:

SELECT d.device_id, d.date_time, d.meas, s.meas_1, s.meas_2, s.meas_3
FROM devices AS d
JOIN sources AS s
ON d.source_id = s.source_id AND d.date_time = s.date_time AND d.device_id = '101' AND d.date_time >= '2016-06-02 00:00' AND d.date_time <= '2016-06-04 23:00'
ORDER BY d.date_time;

对于它的价值,它也适用于WHERE子句中的过滤器而不是JOIN,但它的性能较慢。谢谢你的帮助。

0 个答案:

没有答案