修改dplyr数据库查询

时间:2018-03-16 18:25:03

标签: r dplyr dbplyr

我正在使用dplyr通过数据库连接src执行Redshift查询。 lag在Redshift中的工作方式略有不同(请参阅https://github.com/tidyverse/dplyr/issues/962),所以我想知道是否可以修改从dplyr链生成的查询以删除第三个参数(NULLLAG。例如:

res <- tbl(src, 'table_name') %>% 
  group_by(groupid) %>%
  filter(value != lag(value)) %>%
  collect()

给出

Error in postgresqlExecStatement(conn, statement, ...) : 
  RS-DBI driver: (could not Retrieve the result : ERROR:  Default
    parameter not be supported for window function lag)

我可以看到翻译过的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 ()))

我可以修改它以删除NULL参数,我认为这将解决问题:

sub("(LAG\\(.*), NULL), "\\1", translated)

# <SQL> COLLECT(FILTER(GROUP_BY(TBL("src", 'table_name'), "groupid"), "value" != LAG("value", 1) OVER ()))

如何执行此修改后的查询?

1 个答案:

答案 0 :(得分:1)

您应该可以使用DBI::dbGetQuery(con, sub("(LAG\\(.*), NULL), "\\1", translated))来运行新查询。