У меня есть несколько устройств, которые регистрируют разные данные в разное время и хотят получить все данные в одном запросе, упорядоченные по времени. Пример видов таблиц, которые у меня есть:
CREATE TABLE location(
device_id INT, -- REFERENCES device(id)
timestamp DATETIME2 NOT NULL,
position GEOMETRY NOT NULL
)
CREATE TABLE temperature(
device_id INT, -- REFERENCES device(id)
timestamp DATETIME2 NOT NULL,
temp FLOAT NOT NULL
)
Я хочу иметь один запрос, который объединяет таблицы на device_id и метку времени, которая содержит нули, когда метки времени не совпадают. Пример выходного формата, который я ищу:
device_id, timestamp, location, temperature
1, 2011/12/1 10:00:00, (35.1, 139.2), NULL
1, 2011/12/1 10:00:01, NULL, 9.0
1, 2011/12/1 10:00:02, (35.1, 139.2), 9.1
Я пытался выполнить FULL JOIN, но не могу понять, как сделать столбец метки времени без огромного оператора CASE (имейте в виду, хотя я только показал 2 таблицы, это может иметь гораздо больше).
SELECT
location.device_id,
CASE WHEN location.timestamp IS NOT NULL THEN
location.timestamp
ELSE
temperature.timestamp
END as timestamp,
location,
temp
FROM
location
FULL JOIN temperature ON location.device_id = temperature.device_id
AND location.timestamp = temperature.timestamp
ORDER BY
timestamp
Есть ли более простой способ написать запрос такого типа?