小编典典

具有完整子对象的SQLAlchemy Group By

python

想象下面的媒体表:

| site       | show_id | time |
| ---------------------|-------|
| CNN        | 1       | 'a'   |
| ABC        | 2       | 'b'   |
| ABC        | 5       | 'c'   |
| CNN        | 3       | 'd'   |
| NBC        | 4       | 'e'   |
| NBC        | 5       | 'f'   |
--------------------------------

我想遍历由show_id分组的查询结果,并尝试过以下查询:

listings = session.query(Media).filter(Media.site == "CNN").group_by(Media.show_id).all()

这是我要遍历结果的方式:

for showtimes in listings:
    for show in showtimes:
        print(show.time)

但是该查询并不能给我所有分组的子对象。我想念什么?


阅读 223

收藏
2021-01-16

共1个答案

小编典典

在SQL中,GROUP BY子句根据分组表达式 将分组的行压缩为单个行
。我的猜测是您正在使用SQLite或MySQL的较早版本,因为允许您选择非聚合,而它们在功能上不依赖于分组表达式。在这种情况下,结果包含每个组中未指定行的值,因此很少(如果有的话)很有用。

一个解决方案是在SQL中使用ORDER BY而不是GROUP
BY,然后根据订单表达式在Python中进行分组

from itertools import groupby
from operator import attrgetter

listings = session.query(Media).\
    filter(Media.site == "CNN").\
    order_by(Media.show_id).\
    all()

# Materialize the subiterators to lists
listings = [list(g) for k, g in groupby(listings, attrgetter('show_id'))]
2021-01-16