首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RPostgres中进行参数化查询并附加新的数据

在RPostgres中进行参数化查询并附加新的数据
EN

Stack Overflow用户
提问于 2019-09-27 14:47:40
回答 1查看 113关注 0票数 1

我在dataframe parameters中存储了一组对值。

代码语言:javascript
复制
parameters <- data.frame(
   variant_id = c(1, 2, 3, 4, 5),
   start_date = c("2019-07-01", "2019-09-05", "2019-05-21", "2019-09-06",
                  "2019-04-19"))

> parameters
  variant_id start_date
1          1 2019-07-01
2          2 2019-09-05
3          3 2019-05-21
4          4 2019-09-06
5          5 2019-04-19

我希望将variant_idstart_date的这种组合用作在RPostgres中执行的这个SQL查询的动态参数。

代码语言:javascript
复制
library(RPostgres)
library(tidyverse)

query <- "select sum(o.quantity)
from orders o
where o.date >= << start_date >>
and o.variant_id = << variant_id >> "

df <- dbGetQuery(db, query)

然后,我会有如下的疑问:

代码语言:javascript
复制
query_1 <- "select sum(o.quantity)
from orders o
where o.date >= '2019-07-01'
and o.variant_id = 1 "

result_1 <- dbGetQuery(db, query_1)
 > result_1
     sum
   1 100

query_2 <- "select sum(o.quantity)
from orders o
where o.date >= '2019-09-05'
and o.variant_id = 2 "

result_2 <- dbGetQuery(db, query_2)
 > result_2
     sum
   1 120


query_3 <- "select sum(o.quantity)
from orders o
where o.date >= '2019-05-21'
and o.variant_id = 3 "

result_3 <- dbGetQuery(db, query_3)
 > result_3
     sum
   1 140

..。诸若此类。

然后,我想在一个新的dataframe results中将每个结果附加为:

代码语言:javascript
复制
results <- data.frame(
              variant_id = c(1, 2, 3, 4, 5),
                quantity = c(100, 120, 140, 150, 160)
           )

> results
  variant_id quantity
1          1      100
2          2      120
3          3      140
4          4      150
5          5      160

如何使用RPostgresdplyr来解决这个问题,避免使用循环?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-27 15:12:01

我们没有您的数据库,但是使用了注释中给出的parametersorders。我们将stringsAsFactors = FALSE添加到parameters定义中,以确保具有字符串。

现在,使用sprintf创建查询的字符向量。然后把每一个都运行一遍。在这里,我们使用sqldf使一切都可以复制,因为我们没有数据库,但是您可以用适当的语句替换sqldf,从而从数据库中获得结果。

代码语言:javascript
复制
query <- "select sum(o.quantity)
  from orders o
  where o.date >= '%s'
  and o.variant_id = %s "

queries <- with(parameters, sprintf(query, start_date, variant_id))

library(sqldf)

# replace sqldf in next line with appropriate function to invoke query
do.call("rbind", lapply(queries, sqldf))
##   sum(o.quantity)
## 1               1
## 2              NA
## 3               3
## 4              NA
## 5              NA

备注

代码语言:javascript
复制
# test data

parameters <- data.frame(
   variant_id = c(1, 2, 3, 4, 5),
   start_date = c("2019-07-01", "2019-09-05", "2019-05-21", "2019-09-06",
                  "2019-04-19"), stringsAsFactors = FALSE)

orders <- data.frame(date = "2019-07-02", variant_id = 1:3, quantity = 1:3)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58136845

复制
相关文章

相似问题

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