【发布时间】:2019-07-21 15:05:49
【问题描述】:
我正在实现一个不应该使用 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"
我已阅读以下page 并针对将在 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 代替了之前的值,我找不到 SQLite 的 IGNORE NULLS 的替代品。
哪些修改会返回列的先前值而不是 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"
编辑:我将从其他表中获得的 ID,因此我将 WHERE 选择为“1”只是为了测试。
【问题讨论】:
标签: sql postgresql sqlite