修改dplyr数据库查询
我使用dplyr通过数据库连接修改dplyr数据库查询,r,dplyr,dbplyr,R,Dplyr,Dbplyr,我使用dplyr通过数据库连接src执行红移查询lag在红移中的工作方式稍有不同(请参阅),因此我想知道是否可以修改从dplyr链生成的查询,以删除lag中的第三个参数(NULL)。例如: res <- tbl(src, 'table_name') %>% group_by(groupid) %>% filter(value != lag(value)) %>% collect() 我可以看到已翻译的sql: translated <- dbplyr
src
执行红移查询lag
在红移中的工作方式稍有不同(请参阅),因此我想知道是否可以修改从dplyr链生成的查询,以删除lag
中的第三个参数(NULL
)。例如:
res <- tbl(src, 'table_name') %>%
group_by(groupid) %>%
filter(value != lag(value)) %>%
collect()
我可以看到已翻译的sql:
translated <- dbplyr::translate_sql(
tbl(src, 'table_name') %>%
group_by(groupid) %>%
filter(value != lag(value)) %>%
collect()
)
# <SQL> COLLECT(FILTER(GROUP_BY(TBL("src", 'table_name'), "groupid"), "value" != LAG("value", 1, NULL) OVER ()))
如何执行此修改后的查询?您应该能够使用
DBI::dbGetQuery(con,sub(“(LAG\\(*),NULL),“\\1”,translated))
运行新查询。既然dbplyr使用RPostgreSQL作为其后端驱动程序,您就不能使用它的dbSendQuery
函数吗?您可以使用show\u query
或sql\u render
而不是translate\u sql
吗?您可能可以使用该函数LAG
(大写)直接地,当函数在R dbplyr中不存在时,将尝试SQL函数。因此,我建议尝试filter(value!=LAG(value,1))
或filter(value!=LAG(“value”,1))
您是否能够实现此功能?谢谢。
translated <- dbplyr::translate_sql(
tbl(src, 'table_name') %>%
group_by(groupid) %>%
filter(value != lag(value)) %>%
collect()
)
# <SQL> COLLECT(FILTER(GROUP_BY(TBL("src", 'table_name'), "groupid"), "value" != LAG("value", 1, NULL) OVER ()))
sub("(LAG\\(.*), NULL), "\\1", translated)
# <SQL> COLLECT(FILTER(GROUP_BY(TBL("src", 'table_name'), "groupid"), "value" != LAG("value", 1) OVER ()))