2011-12-29 66 views
1

我想选择一个分组的平均值。查询中的SQL Alchemy group_by

a1_avg = session.query(func.avg(Table_A.a1_value).label('a1_avg'))\ 
     .filter(between(Table_A.a1_date, '2011-10-01', '2011-10-30'))\ 
     .group_by(Table_A.a1_group) 

我已经尝试了这个查询的几个不同的迭代,这是尽可能接近我所需要的。我相当确定group_by正在创建该问题,但我不确定如何使用SQLA正确实现查询。表结构和预期产出:

TABLE A 
A1_ID | A1_VALUE | A1_DATE | A1_LOC | A1_GROUP 
1  | 5  | 2011-10-05 | 5  | 6  
2  | 15  | 2011-10-14 | 5  | 6 
3  | 2  | 2011-10-21 | 6  | 7 
4  | 20  | 2011-11-15 | 4  | 8 
5  | 6  | 2011-10-27 | 6  | 7 

EXPECTED OUTPUT 
A1_LOC | A1_GROUP | A1_AVG 
5  | 6  | 10 
6  | 7  | 4 
+2

怎么回事**不**工作:错误运行或产生错误的结果?如果你更多地解释了什么是你的数据结构和期望的结果,这将会有所帮助......或者,如果你知道你将如何构建一个直接的'SQL'查询 - 有人会很乐意将它翻译成SA查询给你... – van 2011-12-29 12:45:17

回答

3

我猜想,你只是缺少在结果组标识符(a1_group)。同时,(给我正确理解你的模型),你需要添加group by条款也为a1_loc列:

编辑-1:更新由于查询质疑specificaion

a1_avg = session.query(Table_A.a1_loc, Table_A.a1_group, func.avg(Table_A.a1_value).label('a1_avg'))\ 
     .filter(between(Table_A.a1_date, '2011-10-01', '2011-10-30'))\ 
     #.filter(Table_A.a1_id == '12')\ # @note: you do NOT NEED this 
     .group_by(Table_A.a1_loc)\ # @note: you NEED this 
     .group_by(Table_A.a1_group) 
+0

太棒了!应该知道我是在过度思考如此简单的事情。谢谢! – etangman 2011-12-29 13:16:50