[英]Update values of database with values that are already in DB
我有一個數據庫,用於存儲從不同傳感器讀取的數據。 該表如下所示:
[SensorID] [timestampMS] [值]
我要執行的操作如下:有些讀取已損壞(數字為6554),我想用下一個未損壞的值(在下面的示例中為20)更新該讀取。 。 因此,如果數字為6554,我想使用下一個值(以時間戳記)更新該值,則該值不會損壞。
我當時在考慮用PHP執行此操作,但我想知道是否可以直接使用SQL腳本來執行此操作。
欣賞:)
您可以使用相關的子查詢...
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
子查詢獲得以下所有結果,按timestampMS排序,僅獲取第一個結果。 這是該SensorID的下一個值。
注意:如果不存在“下一個”值,它將嘗試使用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)
,只需使用IFNULL(<sub_query>, value)
...
不確定這是否是有效的語法,無法對其進行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
我做了一個基於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用戶有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.