【问题标题】:How to create custom SQL functions with R code in dbplyr?如何在 dbplyr 中使用 R 代码创建自定义 SQL 函数?
【发布时间】:2019-06-10 16:54:48
【问题描述】:

我正在使用 dbplyr 查询 MSSQL 数据库,并且经常使用 mutate(YM = DATEFROMPARTS(YEAR(Date), MONTH(Date), 1)) 将日期四舍五入到月初。我希望能够创建一个 R 函数来为我简化它,例如输入 mutate(YM = round_month(Date)) 并让 dbplyr 将其转换为上面的 DATEFROMPARTS 函数。

看来我可以使用 dbplyr 中的 sql_expr() 函数来做到这一点。通读包的 R 代码,似乎这就是 R 函数的翻译方式。例如:

year = function(x) sql_expr(DATEPART(YEAR, !!x))

见:https://github.com/tidyverse/dbplyr/blob/master/R/backend-mssql.R

所以...我尝试自己做同样的事情:

round_month <- function(x) sql_expr(DATEFROMPARTS(YEAR(!!x), MONTH(!!x), 1))

mytbl %>%
  mutate(YM = round_month(Date)) %>%
  show_query()

我希望得到这个:

<SQL>
SELECT DATEFROMPARTS(YEAR("Date"), MONTH("Date"), 1) AS YM
FROM mytbl

但是我得到了这个:

<SQL>
SELECT round_month("Date") AS YM
FROM mytbl

这显然什么也没做。我做错了什么?

【问题讨论】:

    标签: r sql-server dbplyr


    【解决方案1】:

    试试这个:

    mytbl %>%
      mutate(YM = !!round_month("Date")) %>%
      show_query()
    

    基于此响应: https://community.rstudio.com/t/how-to-subtract-dates-using-dbplyr/22135/5

    【讨论】:

    • 嗯...仍然出现错误:Error in enexpr(x) : object 'Date' not found
    • 如果我这样做 !!round_month(Date) 会收到该错误,而不是 !!round_month("Date")
    【解决方案2】:

    我不确定在这种特定情况下出了什么问题。但是每个 SQL 变体都略有不同,因此如果您能找到产生所需结果所需的确切 SQL 代码,那么只需将原始 SQL 提供给 sql() 函数即可。

    例如,在任何接受 ANSI SQL 的数据库后端上,这将从日期中提取星期(请注意,不幸的是,等效的 lubridate 不能很好地与 dbplyr 配合使用)。

    your_dbplyr_object %>%
      mutate(week = sql("EXTRACT(WEEK FROM meeting_date)"))
    

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2013-04-17
      • 2014-03-14
      相关资源
      最近更新 更多