Обновить значения базы данных значениями, которые уже находятся в БД - PullRequest
0 голосов
/ 22 марта 2011

У меня есть база данных, в которой хранятся данные, считанные с разных датчиков. Таблица выглядит так:

[SensorID] [timestampMS] [значение]
[SENSOR1] [123420] [10]
[SENSOR1] [123424] [15]
[SENSOR1] [123428] [6554]
[SENSOR1] [123429] [20]


Я хотел бы сделать следующее: есть некоторые операции чтения, которые были повреждены (числа 6554), и я хотел бы обновить это с помощью следующего значения, которое не повреждено (в приведенном ниже примере будет 20). , Итак, если число равно 6554, я бы хотел обновить его следующим значением (в метке времени), которое не будет повреждено.
Я думал о том, чтобы сделать это в PHP, но мне интересно, возможно ли сделать это напрямую с помощью сценария SQL.

Ценю:)

Ответы [ 3 ]

2 голосов
/ 22 марта 2011

Не уверен, что это правильный синтаксис, не могу проверить это банкоматом. Возможно, вам придется изменить это значение на JOIN s вместо вложенных подзапросов, но в принципе вы можете сделать что-то вроде (для 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 голосов
/ 22 марта 2011

Вы можете использовать коррелированный подзапрос ...

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)


EDIT

Или, чтобы быть короче, просто используйте IFNULL(<sub_query>, value) ...

1 голос
/ 24 марта 2011

Я сделал обходной путь на основе решения Dems, и он работает в Mysql:

Я создал «копию» таблицы датчиков следующим образом:

drop table if exists sensors_new;
create table if not exists sensors_new like sensors;
insert into sensors_new select * from sensors;

Затем я делаю то, что рекомендовал мне Демс, но использую эту новую таблицу 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...