如何使用sqlalchemy进行平均计数?

问题描述 投票:0回答:1

如何计算SQLAlchemy的平均值?我尝试了很多东西,但是都失败了。代码:

month = sqlalchemy.func.date_trunc('month', Complaint.date)
records_count = sqlalchemy.sql.func.count(ClientGroupRecord.id)
complained_clients = session.query(Friend, records_count.label('count'), month). \
    filter(Friend.friend_id == friend_id). \
    join(Complaint, Complaint.friend == Friend.friend_id). \
    join(ClientGroup, Complaint.client_group == ClientGroup.client_group_id). \
    join(ClientGroupRecord, ClientGroup.client_group_id == ClientGroupRecord.client_group_id). \
    join(Client, Client.client_id == ClientGroupRecord.client_id). \
    group_by(month, Friend.friend_id)

records_avg = sqlalchemy.sql.func.avg(records_count)

result = ???

result中,我不需要Friend,但要在该列上标记为avg并由count列分组的month

python sql database orm sqlalchemy
1个回答
1
投票

[一种选择是使用窗口函数,如果您的DBMS支持它们的话–基于date_trunc的使用,我认为您正在使用PostgreSQL。之所以可行,是因为在GROUP BY产生了组行之后才对窗口函数进行求值。因此将计数包装在AVG(...) OVER ()中,其中窗口是整个结果集:

from sqlalchemy import func

month = func.date_trunc('month', Complaint.date)
records_count = func.count(ClientGroupRecord.id)
# Create a window of the whole set of results
records_avg = func.avg(records_count).over()

complained_clients = session.query(records_avg.label('avg'),
                                   month.label('month')). \
    select_from(Friend). \
    join(Complaint, Complaint.friend == Friend.friend_id). \
    join(ClientGroup, Complaint.client_group == ClientGroup.client_group_id). \
    join(ClientGroupRecord, ClientGroup.client_group_id == ClientGroupRecord.client_group_id). \
    join(Client, Client.client_id == ClientGroupRecord.client_id). \
    filter(Friend.friend_id == friend_id). \
    group_by(month). \
    all()
© www.soinside.com 2019 - 2024. All rights reserved.