2017-09-16 85 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舊版本。

相關問題