【问题标题】:Get the latest records from two tables从两个表中获取最新记录
【发布时间】:2018-12-28 23:40:21
【问题描述】:

我在 SQLite3 数据库中有三个表。我想要一行的结果(对于 json 字符串)每个 DeviceID 的湿度和温度的最新记录,这意味着两条记录来自温度,一条来自湿度。

三个读数同时插入,因此找到一个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。这也需要 19 秒才能运行。

我无法理解这一点。

数据库本身 --> logtest.db at file.io 307,2kB

表格如下:

【问题讨论】:

  • 您能否将您的示例数据作为一组插入语句或 CSV 或其他微不足道的东西添加到数据库中进行测试而不是图像?
  • 我添加了一个下载.db的链接,好吗?

标签: sql sqlite


【解决方案1】:

有趣的一个。

我不能对速度做出承诺:这部分取决于您拥有哪些索引和多少条记录。但我会尝试这样的事情:

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 是否有内置解决方案。

【讨论】:

  • 太好了,这正是我想要的。我在 15 毫秒内得到了结果。不会有更多的设备。现在我要试着理解你做了什么:)
  • @AlexBergsland 很高兴它有帮助!祝你的项目好运!
  • @AlexBergsland 作为附录:因为我使用了内部连接,如果您曾经缺少设备 1 或 2 的时间戳,则整行都会丢失。如果湿度表缺少时间戳,则相同。但是,如果您的数据始终是完整的,并且每个时间戳都存在所有 3 条记录,那么您应该没问题。
【解决方案2】:

如果时间戳确实相同,可以使用关联子查询获取最新的时间戳:

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
                    );

【讨论】:

    猜你喜欢
    • 2018-07-11
    • 2013-06-14
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多