我在SQLite3数据库中有三个表。我想要一个一行结果(对于一个json字符串),每个设备ID的最新湿度和温度记录,这意味着来自温度的两个记录和来自湿度的一个记录。< / p>
三个读数同时插入,因此找到一个MAX(Timestamp)
,然后寻找其他具有相同时间戳记的记录。
结果应如下所示:
Timestamp H C C
1545732002 50 25 25
到目前为止,我能得到的最接近的是:
SELECT max(Humidity.Timestamp), Humidity.H, Temperature.C, CoolTemp.C
FROM Temperature, Humidity
INNER JOIN Devices AS DeviceHum ON Humidity.DeviceID = DeviceHum.DeviceID
INNER JOIN Temperature AS CoolTemp ON Temperature.Timestamp = Humidity.Timestamp`
这给了我设备1的最新H和C,却没有给我设备2的最新C。
我无法解决这个问题。
数据库本身-> logtest.db at file.io 307,2kB
表格如下:
答案 0 :(得分:0)
如果时间戳确实相同,则可以使用相关的子查询来获取最新的时间戳:
select . . .
from temperature t join
humidity h
on t.deviceid = h.deviceid and t.timestamp = h.timestamp
where t.timestamp = (select max(t2.timestamp)
from temperature t2
where t2.deviceid = t.deviceid
);
答案 1 :(得分:0)
有趣的一个。
我不能保证速度:这部分取决于您拥有哪些索引以及多少条记录。但我会尝试这样的事情:
SELECT Hum.Timestamp,
Hum.H,
Hot.C,
Cool.C
FROM Humidity as Hum
INNER JOIN Temperature Hot
ON Hum.Timestamp = Hot.Timestamp and Hot.DeviceId = 1
INNER JOIN Temperature Cool
ON Hum.Timestamp = Cool.Timestamp and Cool.DeviceId = 2
WHERE Hum.Timestamp = (
SELECT MAX(Humidity.Timestamp)
FROM Humidity
)
这仅适用于两个设备。如果您有两个以上,尤其是。如果您有一个任意数字,那么这将更多地成为“旋转问题”(查询值,然后将其侧向翻转),而且我不知道SQLite
是否对此具有内置的解决方案。