Я пытаюсь запросить таблицу в нашей базе данных mySQL с помощью пакета DBI R. Однако мне нужно вытащить поля из таблицы, ежемесячно меняя поле даты и ограничивая его 1.
У меня возникают проблемы с текстом цикла и sql-запроса. Я хотел бы создать цикл, который изменяет дату (ежемесячно), а затем печатает это в запросе базы данных, который затем вытащит все данные, соответствующие месячным условиям.
Это мой код:
for (i in seq(0,12,1)){
results <- dbGetQuery(myDB, paste("SELECT * FROM cost_and_price_period WHERE start_date <=", '01-[[i]]-2019'))
}
Основная проблема заключается в том, что R не признает операторы пост-инкремента, такие как ++, поэтому я знаю, что могу просто сделать 12 отдельных запросов, а затем rbind их, но я бы предпочел сделать один эффективный запрос. У кого-нибудь есть какие-либо идеи?
Это ниже решение может дать вам представление о том, как приступить к вашей проблеме.
> dummyTable
id names dob
1 1 aa 2018-01-01
2 2 bb 2018-02-01
3 3 cc 2018-03-01
4 4 dd 2018-04-01
5 5 ee 2018-05-01
6 6 ff 2018-06-01
7 7 gg 2018-07-01
8 8 hh 2018-08-01
9 9 ii 2018-09-01
10 10 jj 2018-10-01
11 11 kk 2018-11-01
12 12 ll 2018-12-01
13 13 ll 2018-12-01
Представьте, что мы имеем приведенную выше таблицу в MySQL. Затем нам нужно получить доступ к данным за 1-й день каждого месяца и хранить целые записи в качестве фрейма данных.
### Using for loop like from your question
n <- 12
df <- vector("list", n)
for (i in seq(1:12)){
df[[i]] <- data.frame(dbGetQuery(pool, paste0("SELECT * FROM dummyTable WHERE dob = '2018-",i,"-01';" ))) # in iteration 'i' corresponds for month number
}
df <- do.call(rbind, df)
### Using lapply(preffered way)
n <- seq(1:12)
df <- lapply(n, function(x){
dbGetQuery(pool, paste0("SELECT * FROM dummyTable WHERE dob = '2018-",x,"-01';" ))
})
df <- do.call(rbind, df)
Таким образом, вывод фрейма данных df
даст согласованные записи из MySQL.