2017-09-16 28 views
8

让我们来看看例子?sql_variantdbplyr中的sql_variant是否像它应该那样工作?

我们定义聚合函数一个新的翻译功能,从默认的扩展:

postgres_agg <- sql_translator(.parent = base_agg, 
    cor = sql_prefix("corr"), 
    cov = sql_prefix("covar_samp"), 
    sd = sql_prefix("stddev_samp"), 
    var = sql_prefix("var_samp") 
) 

我们再定义一个新的变种,这是从制作在3种不同类型(这里是2)的翻译功能:

postgres_var <- sql_variant(
    base_scalar, 
    postgres_agg 
) 

translate_sql(cor(x, y), variant = postgres_var) 
# <SQL> COR("x", "y") 
translate_sql(sd(income/years), variant = postgres_var) 
# <SQL> SD("income"/"years") 

这些不看翻译对我来说,不应该他们是"CORR""STDDEV_SAMP"

# Original comment: 
# Any functions not explicitly listed in the converter will be translated 
# to sql as is, so you don't need to convert all functions. 
translate_sql(regr_intercept(y, x), variant = postgres_var) 
# <SQL> REGR_INTERCEPT("y", "x") 

这一个表现不如预期,这就像其他2

在另一方面默认转换职能的工作,请参阅:

translate_sql(mean(x), variant = postgres_var) 
#<SQL> avg("x") OVER() 

这是一个错误吗?或者我错过了什么?

我的目标是创建一些变数Oracle,并用它在下面的流行时尚,那么对于更复杂的功能(与SQLite例子是可再生的):

con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:") 
copy_to(con, cars, "cars") 
con %>% tbl("cars") %>% summarize(dist = group_concat(dist)) # works as expected, as we're stealing the keyword from sqlite directly 
sqlite_variant <- sql_variant(aggregate=sql_translator(.parent = base_agg,gpc = sql_prefix("group_concat"))) 
con %>% tbl("cars") %>% summarize(dist = gpc(dist)) # how do I make this work ? 

编辑:

一个赏金后来仍然没有解决方案,我交叉发布问题直接在dplyr/dbplyrgithub页面,我不确定它是否已经或将得到关注,但如果我(或其他人)不更新这一次,检查此网址:https://github.com/tidyverse/dplyr/issues/3117

回答

0

这是哈德利韦翰回答上提供github上链接:

translate_sql()不具有变异的说法更多的

事实上,变体参数没有记录,尽管这些示例使用它,但我想它会在下一个版本中得到纠正。

当被问及如何定义自定义SQL翻译,他曾这样报价:

看一看http://dbplyr.tidyverse.org/articles/new-backend.htmlhttp://dbplyr.tidyverse.org/articles/sql-translation.html

我想另一个选择是获得dbplyr::sql_variant旧版本。

相关问题