【发布时间】:2019-08-16 07:10:07
【问题描述】:
假设我有一个使用 dbplyr 打开的远程 tbl,并且我想对其使用 SQL 查询(可能是因为我想要做的事情没有 dbplyr 翻译),我该如何给它以使其返回一个远程 tbl对象?
DBI::dbGetQuery() 函数允许您向 db 发出查询,但它返回内存上的数据帧,而不是远程 tbl 对象。
例如,假设您已经有一个连接con 到一个数据库,您可以创建一个这样的表:
library(tidyverse)
x_df <- expand.grid(A = c('a','b','c'), B = c('d','e','f', 'g','h')) %>%
mutate(C = round(rnorm(15), 2))
DBI::dbWriteTable(conn = con,
name = "x_tbl",
value = x_df,
overwrite = TRUE)
x_tbl = tbl(con, 'x_tbl')
sql_query <- build_sql('SELECT a, b, c, avg(c) OVER (PARTITION BY a) AS mean_c FROM x_tbl')
y_df <- DBI::dbGetQuery(con, sql_query) # This returns a data frame on memory
y_tbl <- x_tbl %>%
group_by(a) %>%
mutate(mean_c = mean(c))
show_query(y_tbl) # This is a remote tbl object
在这种情况下,我可以使用y_tbl。但是也有函数在dbplyr上没有翻译的情况(比如分位数不起作用),我需要使用SQL代码。但我不想收集结果,我希望它创建一个远程 tbl 对象。有没有办法我可以给出一个 SQL 查询(比如 dbGetQuery())但让它返回一个远程 tbl?
谢谢
【问题讨论】:
标签: sql r dplyr tidyverse dbplyr