Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修改dplyr数据库查询_R_Dplyr_Dbplyr - Fatal编程技术网

修改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

我使用dplyr通过数据库连接
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 ()))