2016-07-20 18 views
0

ファイナンスチームは光沢のあるアプリを使用してcsvファイルを毎月postegreSQLにアップロードしています。 場合によっては、データを改訂してから再度アップロードする必要があります。rpostgreSQL:時間に基づいてデータを上書きする

はさんが理解し、問題を容易にするために、いくつかの例を持ってみましょう:

# 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件のデータを置き換えることができますか?更新クエリがdbSendQueryを使用して

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

答えて

1

を考えてみましょう:: は、私は、次のコマンドは、2016年のデータが上書きされるように指定するために改訂されるべきだと思う

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

を別の方法として、既存のデータフレームを更新し、 、更により

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) 

dbWriteTableでPostgresのdbテーブルを上書き更新されていない行をnewdataに転送し、データベースにプッシュします。

newdata <- rbind(monthly_expense[!(monthly_expense$month %in% newdata$month),], 
       newdata) 

dbWriteTable(con, "expense_table2", value = new_data, append=T, overwrite = TRUE) 
関連する問題