sql - 如何给 dplyr 一个 SQL 查询并让它返回一个远程 tbl 对象?

标签 sql r dplyr tidyverse dbplyr

假设我使用 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/

相关文章:

r - 如何在列上使用 tidyeval 进行变异?

mysql - 需要一个查询来查找两个日期之间的总计,但也会随着时间的推移而更新

java - 将长整型转换为原始 jdbc

r - Lubridate 获取某月某日的日期

r - 是否有可能以 TeX 形式输出符号表达式

python - 如何提高 R 在机器学习中的性能?

r - 如何 group_by(everything())

r - 在 R 中转换为几列的日期?

sql - MySQL 存储过程 : variable in WHERE clause?

MYSQL不使用主键连接