Я реализую запрос, который не должен работать без SQLite и PostgreSQL.В моей базе данных есть 2 таблицы, которые я хочу упорядочить по дате, интерполируя значения датчиков.Мои таблицы следующие:
Valor_Sensor_Pressão:
ID_Sensor_Pressão | Data_Medição | Valor_Medido
1 2016-01-01 10:20:05 13
1 2016-01-01 10:20:06 11
1 2016-01-01 10:20:12 20
1 2016-01-01 10:20:13 0
1 2016-01-01 10:21:05 100
Valor_Sensor_Temperatura:
ID_Sensor_Temperatura | Data_Medição | Valor_Medido
1 2016-01-01 10:20:05 1
1 2016-01-01 10:20:08 3
1 2016-01-01 10:20:12 20
1 2016-01-01 10:21:05 1
1 2016-01-01 10:21:13 31
Я создал следующий SQL для агрегирования и интерполяции данных по датам:
WITH Resultado (ValorPressão, ValorTemperatura, DataMedida) AS (
SELECT
p.Valor_Medido AS pValue,
t.Valor_Medido AS tValue,
COALESCE(p.Data_Medição, t.Data_Medição) AS DataMedida
FROM Valor_Sensor_Pressão AS p
LEFT JOIN Valor_Sensor_Temperatura AS t USING (Data_Medição)
WHERE p.ID_Sensor_Pressão = 1
UNION ALL
SELECT
p.Valor_Medido AS pValue,
t.Valor_Medido AS tValue,
COALESCE(p.Data_Medição, t.Data_Medição) AS DataMedida
FROM Valor_Sensor_Temperatura AS t
LEFT JOIN Valor_Sensor_Pressão AS p USING (Data_Medição)
WHERE
p.Data_Medição IS NULL
AND t.ID_Sensor_Temperatura = 1
ORDER BY COALESCE(p.Data_Medição, t.Data_Medição)
)
SELECT DataMedida, ValorPressão, ValorTemperatura FROM Resultado
В результате получилось следующее:
"2016-01-01 10:20:05" "13" "1"
"2016-01-01 10:20:06" "11" NULL
"2016-01-01 10:20:08" NULL "3"
"2016-01-01 10:20:12" "20" "20"
"2016-01-01 10:20:13" "0" NULL
"2016-01-01 10:21:05" "100" "1"
"2016-01-01 10:21:13" NULL "31"
Я прочитал следующую страницу и адаптировал решение для запроса, который будет использоваться в SQLite.и PostgreSQL:
WITH Resultado (ValorPressão, ValorTemperatura, DataMedida) AS (
SELECT
p.Valor_Medido AS pValue,
t.Valor_Medido AS tValue,
COALESCE(p.Data_Medição, t.Data_Medição) AS DataMedida
FROM Valor_Sensor_Pressão AS p
left join Valor_Sensor_Temperatura t USING (Data_Medição)
WHERE p.ID_Sensor_Pressão = 1
UNION ALL
SELECT
p.Valor_Medido AS pValue,
t.Valor_Medido AS tValue,
COALESCE(p.Data_Medição, t.Data_Medição) AS DataMedida
FROM Valor_Sensor_Temperatura AS t
LEFT JOIN Valor_Sensor_Pressão AS p USING (Data_Medição)
WHERE
p.Data_Medição IS NULL
AND t.ID_Sensor_Temperatura = 1
ORDER BY COALESCE(p.Data_Medição, t.Data_Medição)
)
SELECT
DataMedida,
COALESCE(last_value(ValorPressão) OVER (order by DataMedida), 0) AS ValorPressão,
COALESCE(last_value(ValorTemperatura) over (order by DataMedida), 0) AS ValorTemperatura
FROM Resultado
Я не мог выяснить, в чем заключается ошибка, потому что LAST_VALUE не дал мне предыдущее значение строки, поэтому COALESCE установил 0 вместо предыдущего значения, и я не смогнайти замену IGNORE NULLS для SQLite.
Какие модификации будут возвращать предыдущее значение столбца вместо NULL?Дайте мне что-то вроде этого:
"2016-01-01 10:20:05" "13" "1"
"2016-01-01 10:20:06" "11" "1"
"2016-01-01 10:20:08" "11" "3"
"2016-01-01 10:20:12" "20" "20"
"2016-01-01 10:20:13" "0" "20"
"2016-01-01 10:21:05" "100" "1"
"2016-01-01 10:21:13" "100 "31"
РЕДАКТИРОВАТЬ: идентификаторы, которые я получу из таблицы других, поэтому я поставил ГДЕ, выбрав "1" только для проверки.