请看这个查询:
SELECT EXTRACT(month FROM order_date) "Month"
FROM orders
(来自官方oracle文档的简化示例)
如何在dbplyr
链中集成上述EXTRACT
操作?
我可以接受任何其他解决方法(即使是丑陋/昂贵的),以从服务器端提取月份。
请看这个查询:
SELECT EXTRACT(month FROM order_date) "Month"
FROM orders
(来自官方oracle文档的简化示例)
如何在dbplyr
链中集成上述EXTRACT
操作?
我可以接受任何其他解决方法(即使是丑陋/昂贵的),以从服务器端提取月份。
tbl(con, "orders") %>% mutate(Month = extract(NULL %month from% order_date))
EXTRACT( MONTH FROM "order_date")
这个技巧是行得通的,因为操作符的名称(在百分号之间)被直接翻译为 SQL。 NULL
会消失(不像 NA
)。
?dbplyr::translate_sql
的示例中看到。 - moodymudskipper与此同时,我想到了一些东西。
通过执行以下代码,可以获得给定示例的预期输出:
con <- ROracle::dbConnect(drv, username, password, dbname) # your connection parameters
dplyr::tbl(con,"orders") %>%
extract_o("Month","order_date",append = FALSE,force_upper_case = FALSE)
#' use Oracle EXTRACT function
#'
#' Will add a column to the table, containing extracted value,
#' optionally returns only this column
#' @param data tbl_lazy object
#' @param what type of data to extract
#' @param from column to extract from
#' @param new_col name of new column
#' @param append keep existing columns,
#' FALSE ditches them and keep only extracted column
#' @param force_upper_case make new column name uppercase
extract_o <-function(data, what, from, new_col = what,
append = TRUE,force_upper_case = TRUE) {
allowed <- c("day","month","year","hour","minute","second",
"timezone_hour","timezone_minute",
"timezone_region","timezone_abbr")
assertthat::assert_that(
tolower(what) %in% allowed,
msg=paste("Choose 'what' among",
paste0("'",allowed,"'",collapse=", ")))
if(force_upper_case) new_col <- toupper(new_col)
tbl_query <- as.character(dbplyr::sql_render(data)) # previous query
append_sql <- if(append)
paste0(paste(colnames(data),collapse=", "),", ") else ""
query <- paste0("SELECT ", append_sql, # initial cols or none
"EXTRACT(",what," FROM ",from,") \"",new_col, # new col
"\" FROM (",tbl_query,")") # previous query
dplyr::tbl(data$src$con,sql(query))
}
mutate(Month = sql('extract(month from order_date)')
对我很有效。 - pentandrous