从两个表中获取最新记录

时间:2018-12-28 23:40:22

标签: sql sqlite

我在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

表格如下:

enter image description here enter image description here enter image description here

2 个答案:

答案 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是否对此具有内置的解决方案。