Как создать пользовательские функции SQL с кодом R в dbplyr? - PullRequest
5 голосов
/ 10 июня 2019

Я использую dbplyr для запроса базы данных MSSQL и часто округляю даты до первого числа месяца, используя mutate(YM = DATEFROMPARTS(YEAR(Date), MONTH(Date), 1)). Я хотел бы иметь возможность создать функцию R, которая упростит это для меня, например, наберите mutate(YM = round_month(Date)) и попросите dbplyr перевести это на функцию DATEFROMPARTS выше.

Кажется, я мог бы сделать это, используя функцию sql_expr() в dbplyr. Читая 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

Что, очевидно, ничего не делает. Что я делаю не так?

1 Ответ

1 голос
/ 10 июня 2019

Попробуйте это:

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

На основании этого ответа: https://community.rstudio.com/t/how-to-subtract-dates-using-dbplyr/22135/5

...