将现有和不存在的数据框的混合插入到sql中

时间:2015-10-29 07:41:54

标签: sql r rodbc

我想使用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"。但下次我可能无法获胜。

1 个答案:

答案 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')