我对R和SQL比较陌生,我一直坚持查询,希望有人能回答我的问题。
我使用RODBC软件包,我需要做一个相当复杂的查询。
我有一个R数据框,如下所示:
donor_id <- c(1,2)
date <- c(as.Date('2011-01-01'), as.Date('2013-06-14'))
df <- cbind(donor_id, date)
这是一个大型数据库,每个捐赠者都有捐赠日期。
我想从数据库向数据框添加一列。此列将是我的每个捐赠者在我的数据框中的日期之前所做的捐赠数量。
所以根据this post,有3个解决方案:
我从this post为一般MO和this post提取了行总和的想法。
一般的想法是合并我的数据框和查询
merge(df,query, by='donor_id')
查询如下所示:
paste("select donor_id, SUM(CASE WHEN donation_date <= ",df$date,"
THEN collection_count ELSE 0 END) AS 'ncol' from fact_collection
GROUP BY donor_id"))
但是,当我尝试这个时,我收到以下错误消息:
fix.by(by.y,y)出错:&#39;&#39;必须指定唯一有效的列
这意味着我的合并由于某种原因无法识别donor_id。
答案 0 :(得分:0)
假设df
具有多行,则不能单独使用sqlQuery
来执行R字符向量中包含的一系列查询。如?sqlQuery
所述,参数query
必须是有效的SQL语句。您的paste
语句的输出如下所示:
[1] "select donor_id, SUM(CASE WHEN donation_date <= 2016-01-01
THEN collection_count ELSE 0 END) AS 'ncol' from fact_collection
GROUP BY donor_id"
[2] "select donor_id, SUM(CASE WHEN donation_date <= 2016-01-02
THEN collection_count ELSE 0 END) AS 'ncol' from fact_collection
GROUP BY donor_id"
[3] "select donor_id, SUM(CASE WHEN donation_date <= 2016-01-03
THEN collection_count ELSE 0 END) AS 'ncol' from fact_collection
GROUP BY donor_id"
等
与其尝试在单个sqlQuery语句中运行查询向量,不如考虑使用apply
系列中的函数,然后使用rbind
将数据帧聚合为一个,例如:>
all_results <- apply(df$date,1,function(value){
query <- paste("select donor_id, SUM(CASE WHEN donation_date <= ",value,"
THEN collection_count ELSE 0 END) AS 'ncol' from fact_collection
GROUP BY donor_id"))
result <- sqlQuery(connection,query)
return(result)
}) # returns a list of results in separate data frames
results_df <- do.call(rbind, all_results) # combine list of dataframes into a monolith