我有一个存储从不同传感器读取的数据的数据库。该表如下所示:
[SensorID] [timestampMS] [value]
我想做的是以下内容:有些读取已损坏(数字为6554),我想用下一个未损坏的值更新(在下面显示的示例中为20) 。因此,如果一个数字是6554,我想用下一个值(在时间戳中)更新它,这是没有损坏的。
我想在PHP中这样做,但我想知道是否可以直接用SQL脚本来完成它。
欣赏:)
答案 0 :(得分:2)
您可以使用相关的子查询...
UPDATE
myTable
SET
value = (SELECT value FROM myTable AS NextValue WHERE sensorID = myTable.SensorID AND timestampMS > myTable.timestampMS ORDER BY timestampMS ASC LIMIT 1)
WHERE
value = 6554
子查询获得以下所有结果,按时间戳排序,只取第一个;这是该SensorID的下一个值。
注意:如果不存在“next”值,它将尝试使用NULL值进行更新。要解决此问题,您可以将其添加到WHERE子句...
AND EXISTS (SELECT value FROM myTable AS NextValue WHERE sensorID = myTable.SensorID AND timestampMS > myTable.timestampMS ORDER BY timestampMS ASC LIMIT 1)
修改强>
或者,为了更短,只需使用IFNULL(<sub_query>, value)
...
答案 1 :(得分:2)
不确定这是否是有效的语法,无法测试它的ATM。您可能需要将其更改为JOIN
而不是嵌套子查询,但在概念上,您可以执行类似(对于SQL Server):
UPDATE t1
SET Value = ( SELECT Value
from MyTable t2
WHERE t2.SensorID =t1.SensorID
AND t2.[timestamp] =
( SELECT MIN([TimeStamp])
FROM mytable t3
where t3.sensorid = t2.sensorID
AND t3.[timestamp] > t2.[timestamp]
)
)
FROM Mytable t1
WHERE t1.value = 6554
答案 2 :(得分:1)
我根据Dems解决方案做了一个解决方法,它在Mysql中运行:
我已经创建了传感器表的“副本”,如下所示:
drop table if exists sensors_new;
create table if not exists sensors_new like sensors;
insert into sensors_new select * from sensors;
然后我做了Dems建议我做的事情,但是在select中使用这个新的aux表(以避免在同一个表中执行select时更新表时Mysql启动的错误。)
UPDATE
sensors
SET
raw_data = (SELECT raw_data FROM sensors_new AS NextValue WHERE sensor_id = sensors.sensor_id AND timestampMS > sensors.timestampMS ORDER BY timestampMS ASC LIMIT 1)
WHERE
value = 6554
然后,只需删除这个辅助表格。
我希望这有助于Mysql用户。