Вставить сочетание существующего и несуществующего фрейма данных в sql

Я хотел бы записать прогнозируемые данные на sql-сервер с помощью R и RODBC. Каждый прогноз рассчитан на следующие шесть часов, и я хотел бы сохранить только последнее поколение каждого прогноза. Проиллюстрировано здесь:

set.seed(1)
# First forecast at 00:00:00
df.0 <- data.frame(Dates = seq.POSIXt(from = as.POSIXct("2015-10-29 00:00:00"), 
                                      to = as.POSIXct("2015-10-29 5:00:00"), by = "hour"), 
                   Value = runif(6, min = 0, max = 6))

# Second forecast at 01:00:00
df.1 <- data.frame(Dates = seq.POSIXt(from = as.POSIXct("2015-10-29 01:00:00"), 
                                      to = as.POSIXct("2015-10-29 6:00:00"), by = "hour"), 
                   Value = runif(6, min = 0, max = 6))

Теперь, в 00:00:00, я сохраню свой первый прогноз в свою базу данных dbdata:

require(RODBC)

sqlSave(channel = dbdata, data = df.0, tablename = "forecasts", 
append = TRUE, rownames = FALSE, fast = FALSE, verbose = TRUE)

# Query: INSERT INTO "forecast" ( "Dates", "Values") VALUES 
( '2015-10-29 00:00:00', '1.59')
# Query: INSERT INTO "forecast" ( "Dates", "Values") VALUES 
( '2015-10-29 00:00:00', '2.23')
# etc for all 6 forecasts

Теперь, в 01:00:00, я получаю новый прогноз. Я хочу сохранить / обновить этот прогноз, поэтому я заменяю все значения из 01:00:00 to 05:00:00 и также добавляю самый новый прогноз в 06:00:00.

Обновление работает хорошо, поэтому я могу перезаписать файлы, но обновление не может вставить последний прогноз 06:00:00.

sqlUpdate(channel = dbdata, dat = df.1, tablename = "forecasts", 
fast = FALSE, index = c("Dates"), verbose = TRUE)

# Query: UPDATE "forecast" SET "Value" = 5.668 WHERE "Dates" = '2015-10-29 00:01:00'
# etc. until 
# Error in sqlUpdate(channel = prognoser, dat = df.1[, ], 
# table = "forecast",  : 
# [RODBC] ERROR: Could not SQLExecDirect 
# 'UPDATE " "forecast" SET "Value" = 1.059 WHERE "Dates" = '2015-10-29 06:00:00'

Таким образом, эту проблему, вероятно, можно решить разными способами - но каковы хорошие способы сделать это?

Я думаю, что должны быть лучшие способы, чем просто прочитать таблицу и узнать, как долго прогноз находится в базе данных. Затем разделите новые данные на часть обновления и сохранения и запишите их.

Это t-sql сервер Microsoft. Таблицы находятся в одной базе данных - но это чистое совпадение. Это означает следующее: RODBC: объединить таблицы из разных баз данных (канал) не должно быть проблемой, и, возможно, я смогу обойтись с t-sql "MERGE INTO". Но в следующий раз, наверное, не смогу.


person Thorst    schedule 29.10.2015    source источник
comment
Не знаком с t-sql. Можете ли вы добавить первичный ключ в столбец Dates? Затем вы можете использовать INSERT в обоих запросах, и движок (возможно) автоматически должен обновлять повторяющиеся Dates значения.   -  person nicola    schedule 29.10.2015
comment
Это не сработает :) Сроки - это уже ключ.   -  person Thorst    schedule 29.10.2015


Ответы (1)


Вы можете попробовать сделать условную вставку с последующим обновлением, условная вставка означает, что вы вставляете только в том случае, если Дата еще не существует, и обновление всегда выполняется успешно (вы делаете некоторые ненужные обновления, если значение было успешно вставлено)

Что-то вроде следующего для условной вставки:

INSERT INTO "forecast" ( "Dates", "Values") VALUES ( '2015-10-29 00:00:00', '2.23') where not exists (select 1 from "forecast"  where "Dates"='2015-10-29 00:00:00')
person Bert Neef    schedule 29.10.2015