假设我使用 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()
)但让它返回远程表?
谢谢
最佳答案
嗯,考虑一下它的工作原理,我想我找到了一种方法。您可以在 mutate 函数内给出 sql 查询:
y_tbl <- x_tbl %>%
group_by(a) %>%
mutate(mean_c = sql("avg(c) OVER (PARTITION BY a)"))
show_query(y_tbl) # This is a remote tbl object
这将让您给出变量的 SQL 定义,而无需计算表。
关于sql - 如何给 dplyr 一个 SQL 查询并让它返回一个远程 tbl 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55348039/