我正在尝试使用DBI R包查询我们的mySQL数据库中的表。但是,我需要通过每月更改日期字段并将其限制为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个单独的查询,然后重新绑定它们,但我希望做一个高效的查询。有人有什么想法吗?
答案 0 :(得分:1)
下面的解决方案可以让您了解如何解决您的问题。
虚拟表
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中有上表。然后,我们需要访问每月第一天的数据,并将整个记录存储为数据框。
### 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(preferred 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的匹配记录。