Сложная ВСТАВКА В оператор SELECT в SQL

#sql #insert #sql-insert

#sql #вставить #sql-вставка

Вопрос:

У меня есть две таблицы в SQL. Мне нужно добавить строки из одной таблицы в другую. Таблица, в которую я добавляю строки, выглядит следующим образом:

 timestamp, deviceID, value

2020-10-04, 1, 0
2020-10-04, 2, 0
2020-10-07, 1, 1
2020-10-08, 2, 1
  

Но я должен добавить строку в эту таблицу, если состояние для конкретного DeviceID было изменено по сравнению с последней меткой времени.

Например, эта запись «2020-10-09, 2, 1» не будет добавлена, потому что значение не было изменено для DeviceID = 2 и last timestamp = «2020-10-08». В то же время будет добавлена запись «2020-10-09, 1, 0», поскольку значение для DeviceID = 1 было изменено на 0.

У меня проблема с написанием запроса для этой логики. Я написал что-то вроде этого:

 insert into output
select *
from values
where value != (
select value
from output
where timestamp = (select max(timestamp) from output) and output.deviceID = values.deviceID)
  

Конечно, это не работает из-за последней части запроса «и output.DeviceID = values.DeviceID».
На самом деле проблема в том, что я не знаю, как взять значение из таблицы «output», где DeviceID такой же, как в строке, которую я пытаюсь вставить.

Комментарии:

1. Пометьте свой вопрос своей СУБД. Предоставьте values образец таблицы.

Ответ №1:

Я бы использовал order by и что-то, чтобы ограничить одну строку:

 insert into output
    select *
    from values
    where value <> (select o2.value
                    from output o2
                    where o2.deviceId = v.deviceId
                    order by o2.timestamp desc
                    fetch first 1 row only
                   );
  

Приведенное выше является стандартным SQL. У определенных баз данных могут быть другие способы выразить это, такие как limit или top (1) .