我想使用R和RODBC将预测数据写入sql-server。每个预测都是接下来的六个小时,我想只保存每个foreacst的最新一代。插图如下:
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
微软服务器。这些表位于同一个数据库中 - 但这纯属巧合。这意味着:RODBC: merge tables from different databases (channel)不应成为问题,也许我可以使用t-sql "MERGE INTO"
。但下次我可能无法获胜。
答案 0 :(得分:0)
您可以尝试进行条件插入,然后进行更新,条件插入意味着只有在日期不存在且且更新始终成功时才插入(如果成功插入值,则执行一些不必要的更新)
条件插入的类似内容:
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')