在SQL中查询R数据帧中的条件

时间:2017-11-17 03:28:11

标签: sql-server r rodbc

我对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。

1 个答案:

答案 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