Прежде всего - спасибо, что нашли время, чтобы просмотреть мой вопрос, независимо от того, ответите вы или нет!
Я пытаюсь создать функцию, которая перебирает мой df и запрашивает необходимые данные из SQL, используя пакет RODBC в R. Однако у меня возникают проблемы с настройкой запроса, поскольку параметр запроса изменяется на каждой итерации (пример ниже)
Итак, мой df выглядит так:
ID Start_Date End_Date
1 2/2/2008 2/9/2008
2 1/1/2006 1/1/2007
1 5/7/2010 5/15/2010
5 9/9/2009 10/1/2009
Как мне указать дату начала и дату окончания в моей программе sql?
вот что у меня есть до сих пор:
data_pull <- function(df) {
a <- data.frame()
b <- data.frame()
for (i in df$id)
{
dbconnection <- odbcDriverConnect(".....")
query <- paste("Select ID, Date, Account_Balance from Table where ID = (",i,") and Date > (",df$Start_Date,") and Date <= (",df$End_Date,")")
a <- sqlQuery(dbconnection, paste(query))
b <- rbind(b,a)
}
return(b)
}
Однако это ни о чем не спрашивает. Я считаю, что это как-то связано с тем, как я указываю дату начала и окончания итерации.
Если кто-нибудь может помочь в этом, мы будем очень признательны. Если вам нужны дополнительные пояснения, пожалуйста, не стесняйтесь спрашивать!
paste
конкатенацию для SQL-запросов, рискуя в лучшем случае синтаксическими ошибками, в худшем — внедрением SQL (преднамеренно или нет). ). Вместо этого используйтеRODBCext
(связанный вопрос: stackoverflow.com/q/16178640/3358272) (если толькоRODBC
не начал делать это напрямую , я действительно удивлен, что они еще не внедрили его, поскольку это довольно важно для хороших практик БД). cran.r-project.org/web/packages/RODBCext/ виньетки/ - person r2evans   schedule 03.01.2019rbind
, как это, это снизит производительность в долгосрочной перспективе (каждый вызовrbind
создает полную копию всех предшествующих и добавляемых данных). ПосколькуRODBCext::sqlExecute
напрямую поддерживает векторизацию с помощью фрейма (см. cran.r- project.org/web/packages/RODBCext/vignettes/, раздел 2.3.2), цикл вообще не нужен. - person r2evans   schedule 03.01.2019rbind
запуск внутри цикла приводит к квадратичному копированию. Всегда избегайте роста объектов в циклах - person Parfait   schedule 03.01.2019