python - sqlalchemy - 对项目进行分组并遍历子列表

标签 python sql sqlalchemy

考虑这样一个表:

| Name       | Version | Other |
| ---------------------|-------|
| Foo        | 1       | 'a'   |
| Foo        | 2       | 'b'   |
| Bar        | 5       | 'c'   |
| Baz        | 3       | 'd'   |
| Baz        | 4       | 'e'   |
| Baz        | 5       | 'f'   |
--------------------------------

我想写一个 sqlalchemy 查询语句来列出最大版本的所有项目(作为映射器对象,而不仅仅是 Name 列):Foo-2-b, Bar-5-c, Baz-5- f。我知道我必须使用 group_by 方法,但除此之外,我对如何检索子列表(然后找到最大元素)感到困惑。 SQLAlchemy 文档对此显然不是很清楚。

在实际场景中,还有许多其他列(如“其他”)——这就是为什么我需要返回实际的行对象(映射器类)而不仅仅是“名称”值。

最佳答案

如果您需要完整的对象,您需要在子查询中按名称选择最大版本并加入:

max_versions = session.query(Cls.name, func.max(Cls.version).label('max_version'))\
                      .group_by(Cls.name).subquery()
objs = session.query(Cls).join((max_versions,
           and_(Cls.name == max_versions.c.name,
                Cls.version == max_versions.c.max_version)
       )).all()

这将导致类似这样的结果:

SELECT tbl.id AS tbl_id, tbl.name AS tbl_name, tbl.version AS tbl_version
FROM tbl JOIN (SELECT tbl.name AS name, max(tbl.version) AS max_version
FROM tbl GROUP BY tbl.name) AS anon_1 ON tbl.name = anon_1.name AND tbl.version = anon_1.max_version

请注意,如果有多行具有最大版本,您将获得具有相同名称的多行。

关于python - sqlalchemy - 对项目进行分组并遍历子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1279356/

相关文章:

sqlalchemy - Sql Alchemy 过滤器/where 子句由 OR 而非 AND 连接

python - Pandas 不根据列值进行过滤

Python 调整返回类型以考虑输入类型

SQL查找树中的所有直接后代

sql - PostgreSQL 9.6 - 在冲突时插入并在返回时更新

python - sqlalchemy 外键/查询连接

python - 迭代列表列表并附加到新列表

python - 如何使用 .apply() 将一列字典合并为一个字典?

mysql - MySQL 中子查询的聚合结果不保留我的字段之一

python - 如何在 sqlalchemy 中为我的主键列配置序列对象?