首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rpostgreSQL:根据时间覆盖数据

rpostgreSQL:根据时间覆盖数据
EN

Stack Overflow用户
提问于 2016-07-20 17:05:47
回答 1查看 300关注 0票数 0

我们的财务团队每月都会使用shiny app将csv文件上传到postegreSQL。有时,他们需要修改数据,然后再次上传。

让我们举一些例子,让这个问题更容易理解:

代码语言:javascript
复制
# Retrieve data from PostgreSQL
>monthly_expense <- dbGetQuery(con, "SELECT * from expense_table2")
>monthly_expense
>month   type  USD
 201605    A   200
 201605    B   300
 201606    A   105
 201606    B   200

 # Produce new 201606 data
 >month<-c("201606", "201606")
 >type<-c("A", "B")
 >USD<-c(150, 250)
 >new_data<-data.frame(month, type, USD )
 >new_data
    month    type USD
 1  201606    A   150
 2  201606    B   250

那么我如何用新的数据替换201606个数据呢?我认为应该修改以下命令,以指定覆盖2016年的数据:

代码语言:javascript
复制
 dbWriteTable(con, "expense_table2", value = new_data, append=T, overwrite = TRUE)  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-21 12:21:35

考虑使用dbSendQuery的更新查询

代码语言:javascript
复制
sqlstrings <- paste0("UPDATE expense_table2 SET USD = ", newdata$USD , " 
                      WHERE month='", newdata$month, "' AND type='", newdata$type, "';")

queryruns <- lapply(sqlstrings, function(x) dbSendQuery(con, x))

或者,更新现有的数据帧,然后用dbWriteTable覆盖Postgres的db表

代码语言:javascript
复制
index <- match(monthly_expense$month, new_data2$month)
monthly_expense[index, 2:3] <- new_data2[2:3]

dbWriteTable(con, "expense_table2", value = monthly_expense, append=T, overwrite = TRUE) 

更重要的是,将未更新的行rbind到newdata并将其推送到数据库:

代码语言:javascript
复制
newdata <- rbind(monthly_expense[!(monthly_expense$month %in% newdata$month),],
                 newdata)

dbWriteTable(con, "expense_table2", value = new_data, append=T, overwrite = TRUE)  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38476891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档