Получить последние записи из двух таблиц - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть три таблицы в базе данных SQLite3.Я хочу получить результат из одной строки (для строки json) с последней записью влажности и температуры для каждого идентификатора устройства , что означает две записи из температуры и одну из влажности.

Три показания вставляются одновременно, поэтому найдите одно 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`

, который дает мне последние H и C с устройства 1, но не последний C с устройства 2. Для запуска также требуется 19 секунд.

Я не могу разобраться с этим.

Сама база данных -> logtest.db в file.io 307,2kB

Таблицывыглядеть так:

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

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Интересный.

Я не могу давать обещания о скорости: это будет зависеть отчасти от того, какие у вас индексы и сколько записей.Но я бы попробовал что-то вроде этого:

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 встроенное решение для этого.

0 голосов
/ 29 декабря 2018

Если временные метки действительно совпадают, вы можете использовать коррелированный подзапрос, чтобы получить последнюю временную метку:

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
                    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...