我有一个表table1
,在ID
列的每个值中包含多行。对于大量列,我想使用相同的持续时间列time
来计算相同类型的加权平均值。
我可以手动定义每一列:
drop table if exists table2;
create table table2 as
select ID,
sum(var1*time)/sum(time) as var1,
sum(var2*time)/sum(time) as var2,
sum(var3*time)/sum(time) as var3,
sum(var4*time)/sum(time) as var4
from table1 group by ID;
有没有办法以编程方式为大量列执行此操作?
我们可以说我可以使用正则表达式来识别感兴趣的列。我们可以在这个例子中使用语法var1,var2,var3等。
答案 0 :(得分:1)
考虑构建sum表达式的向量,然后在较大的SQL语句中构建paste(..., collapse)
。将1:4
调整为实际变量范围。换行符不会在传递的查询中呈现。
sums <- paste0(" sum(var", 1:4, "*time)/sum(time) as var", 1:4)
sql <- paste0('select ID,\n',
paste(sums, collapse = ', \n'), '\n',
'from table1 \n',
'group by ID;')
cat(sql)
# select ID,
# sum(var1*time)/sum(time) as var1,
# sum(var2*time)/sum(time) as var2,
# sum(var3*time)/sum(time) as var3,
# sum(var4*time)/sum(time) as var4
# from table1
# group by ID;
channel <- odbcConnect("redacted",uid="redacted",case="nochange")
x <- sqlQuery(channel, sql)
答案 1 :(得分:0)
有点诙谐,但这也是我真正必须做的事情(在R中):
library(RODBC)
library(data.table)
channel <- odbcConnect("redacted",uid="redacted",case="nochange")
x <- as.data.table(sqlQuery(channel, "select * from schema1.table1"))
vars <- grep("var", names(x), v=TRUE)
out <- x[,lapply(.SD, function(v){
sum(v*time)/sum(time)
}),by=ppt_id, .SDcols=vars]
sqlSave(channel, as.data.frame(out), tablename="schema1.table2")
我仍然想知道如何在mysql中执行此操作。