4

次のようなテーブルを考えてみましょう。

| 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のドキュメントは、これについては明らかにあまり明確ではありません。

実際のシナリオでは、他にも多くの列('Other'など)があります。そのため、'Name'値だけでなく、実際の行オブジェクト(マッパークラス)を返す必要があります。

4

2 に答える 2

6

完全なオブジェクトが必要な場合は、サブクエリで名前で最大バージョンを選択し、それに参加する必要があります。

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

最大バージョンの行が複数ある場合は、同じ名前の行が複数あることに注意してください。

于 2009-08-14T18:53:40.940 に答える
-2

engine.executeコマンドで呼び出すことができるSQLは次のとおりです。

select
    t1.*
from
    table t1
    inner join 
        (select
            Name,
            max(version) as Version
         from
            table
         group by
            name) s on
        s.name = t1.name
        and s.version = t1.version
于 2009-08-14T18:32:49.703 に答える