Я хотел бы записать прогнозируемые данные на 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"
. Но в следующий раз, наверное, не смогу.
t-sql
. Можете ли вы добавить первичный ключ в столбецDates
? Затем вы можете использоватьINSERT
в обоих запросах, и движок (возможно) автоматически должен обновлять повторяющиесяDates
значения. - person nicola   schedule 29.10.2015