【发布时间】:2013-01-18 15:58:37
【问题描述】:
我有三个表,设置如下:
TEMPERATURE_1
time
zone (FK)
temperature
TEMPERATURE_2
time
zone (FK)
temperature
TEMPERATURE_3
time
zone (FK)
temperature
每个表中的数据都会定期更新,但不一定同时更新(即时间条目不相同)。
我希望每次都能从每个表中访问最接近的读数,即:
TEMPERATURES
time
zone (FK)
temperature_1
temperature_2
temperature_3
换句话说,对于我的三个表中的每个唯一时间,我都希望在 TEMPERATURES 表中有一行,其中 temperature_n 值是与每个原始表在时间上最接近的温度读数。
目前,我使用两个视图进行了设置:
create view temptimes
as select time, zone
from temperature_1
union
select time, zone
from temperature_2
union
select time, zone
from temperature_3;
create view temperatures
as select tt.time,
tt.zone,
(select temperature
from temperature_1
order by abs(timediff(time, tt.time))
limit 1) as temperature_1,
(select temperature
from temperature_2
order by abs(timediff(time, tt.time))
limit 1) as temperature_2,
(select temperature
from temperature_3
order by abs(timediff(time, tt.time))
limit 1) as temperature_3,
from temptimes as tt
order by tt.time;
这种方法有效,但在生产中使用太慢(对于每个温度约 1000 条记录的小型数据集需要几分钟以上)。
我不擅长使用 SQL,所以我确定我错过了执行此操作的正确方法。我应该如何解决这个问题?
【问题讨论】:
-
zone有什么意义? -
它是另一个表的外键,它将温度读数与我的数据模型的其余部分联系起来。本质上,每个区域都会有一组独立的温度读数(所以在一天结束时,我希望能够从 zone=
的温度中选择 ) -
如果你提供了一个带有样本数据的测试用例,那真的很有帮助。示例:sqlfiddle.com/#!2/85a7b/1
-
你可以试试这样的 - sqlfiddle.com/#!9/5db76/4。无论如何,必须在 DB 端完成很多循环,所以我不确定这是否会使其更快。快速做到这一点的一种方法是使用临时表或物化视图,但这需要额外的思考)
标签: mysql sql time-series