将现有和不存在的数据帧混合插入sql

将现有和不存在的数据帧混合插入sql,sql,r,rodbc,Sql,R,Rodbc,我想使用R和RODBC将预测数据写入sql server。每个预测都是针对未来六个小时的,我只想保存每个预测的最新一代。如图所示: 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

我想使用R和RODBC将预测数据写入sql server。每个预测都是针对未来六个小时的,我只想保存每个预测的最新一代。如图所示:

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))
现在,在
01:00:00
我得到了一个新的预测。我想保存/更新此预测,因此我将替换从
01:00:00到05:00:00的所有值,并在
06:00:00
添加最新预测

更新工作正常-因此我可以覆盖文件-但更新无法插入最后一个
06:00:00
forecast

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'
因此,这可能可以通过很多方法来解决-但是有什么好方法可以做到这一点呢?

我认为一定有更好的方法,而不是阅读表格,找出预测在数据库中的时间长度。然后将新数据拆分为更新部分和保存部分,并将它们写入


它是一个microsoft服务器
t-sql
。这些表在同一个数据库中,但这纯粹是巧合。这意味着:这不应该是一个问题,也许我可以通过t-sql
“合并到”
“中来逃脱。但下一次我可能不能

您可以尝试先进行条件插入,然后进行更新,条件插入意味着您仅在日期不存在且更新始终成功的情况下进行插入(如果成功插入值,则执行一些不必要的更新)

对于条件插入,类似于以下内容:

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

不熟悉
t-sql
。能否在
日期
列中添加主键?然后,您可以在两个查询中使用
INSERT
,引擎(可能)会自动更新重复的
Dates
值。这不起作用:)日期已经是键。
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')