R: SQL-запрос для извлечения среднего

Я хотел бы агрегировать CD, что означает CD_TALHAO, ID_UNIQUE и DATA_S2, используя SQL-запрос с пакетом glue. Но когда я пытаюсь:


library(dplyr)
library(rgdal)
library(rgeos)
library(DBI)
library(glue)

# get AOI
download.file(
  "https://github.com/Leprechault/trash/raw/main/stands_example.zip",
  zip_path <- tempfile(fileext = ".zip")
)
unzip(zip_path, exdir = tempdir())

# Open the files 
setwd(tempdir())
stands_ds <- read.csv("pred_target_stands.csv", sep=";") # Data set
stands_ds <- stands_ds %>%
  mutate(DATA_S2 = ymd(DATA_S2))
stands_ds$CLASS<-c(rep("A",129),rep("B",130)) 
stands_ds$CD<-abs(rnorm(length(stands_ds[,1]),mean=50))

# Crete like a SQL server condition
bq_conn<- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
DBI::dbWriteTable(bq_conn, "stands_ds", stands_ds)

# Aggregate CD mean by CD_TALHAO, ID_UNIQUE and DATA_S2
sqlInput_pred_FARM <- glue::glue_sql("SELECT * FROM stands_ds AVG(CD) GROUP BY CD_TALHAO = {x} AND ID_UNIQUE = {y} AND DATA_S2 = {z}",
 x = "001G", y = "CERROCOROADO_001G", 
 z = "2021-04-02",.con=bq_conn)
pred_attack_BQ_FARM  <- dbGetQuery(bq_conn, as.character(sqlInput_pred_FARM, stringsAsFactors = T))


У меня всегда есть Error: near "(": syntax error в качестве вывода. Пожалуйста, помогите с этим?

Ваш SQL-запрос выглядит нестандартно: я никогда не видел синтаксиса AVG(CD) между FROM и WHERE ... Я считаю, что хорошо разбираюсь в SQL, но каждый день узнаю что-то новое. Вы знаете, что это правильно? (Я бы ожидал что-то вроде select *, avg(cd) from ..., хотя, по общему признанию, ничего не зная о схеме, здесь могут быть и другие проблемы).

r2evans 23.04.2022 00:56
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
1
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте следующее:

statement <- "SELECT * FROM stands_ds AVG(CD) 
              GROUP BY CD_TALHAO = ? AND ID_UNIQUE = ? AND DATA_S2 = ?"

pars <- list("001G", "CERROCOROADO_001G","2021-04-02")

pred_attack_BQ_FARM  <- dbGetQuery(bq_conn, statement, params = pars)

Это новое для меня, как у вас может быть функция агрегации AVG(CD)междуFROM и WHERE?

r2evans 23.04.2022 00:30

@r2evans Я просто скопировал заявление и заменил {} на ?

onyambu 23.04.2022 00:31

Возможно, это скорее комментарий к ОП... Я надеялся, что синтаксис SQL вам понятен.

r2evans 23.04.2022 00:45
Ответ принят как подходящий

Извините @KU99, но ваше решение не возвращает средние значения, как я ожидал. Теперь я пробую что-то новое, например, создание объекта для моей средней операции, и, несмотря на некоторые уродливые результаты с REPLICATE(DATE()), теперь работает. Решение:

# Aggregate CD mean by CD_TALHAO, ID_UNIQUE and DATA_S2
sqlInput_pred_FARM <- glue::glue_sql("SELECT REPLICATE(CD_TALHAO,1) AS TALHAO, REPLICATE(ID_UNIQUE,1) AS ID, REPLICATE(DATE(DATA_S2),1) AS DATE, AVG(CD) AS CD FROM stands_ds GROUP BY CD_TALHAO = {x},ID_UNIQUE = {y}, DATA_S2 = {z} ORDER BY CD_TALHAO = {x},ID_UNIQUE = {y}, DATA_S2 = {z}",
                                      x = "001G", y = "CERROCOROADO_001G", 
                                      z = "2021-04-02",.con=bq_conn)
pred_attack_BQ_FARM  <- dbGetQuery(bq_conn, as.character(sqlInput_pred_FARM, stringsAsFactors = T))
pred_attack_BQ_FARM 
#  TALHAO                ID        DATE       CD
#1   001C CERROCOROADO_001C -4661-02-24 49.93823
#2   001G CERROCOROADO_001G -4661-02-24 50.12102

Другие вопросы по теме