SQLAlchemy:从多列

时间:2016-11-10 22:12:35

标签: python sqlalchemy

我有一个postgres数据库,其数据结构如下:

App-Type | App-Version | Version-Number | Description | Number

---------|-------------|----------------|------------ |---------

 Android |     Bulls   |      1.0       |    APK      |  100

 iOS     |     Bulls   |      1.0       |    plist    |  100

 Android |     Bulls   |      1.0       |    APK      |   99

 Android |     Titans  |      1.0       |    APK      |  100

 iOS     |     Titans  |      1.0       |    plist    |  100

 iOS     |     Titans  |      1.0       |    plist    |   99

 Android |     Titans  |      1.0       |     APK     |   98

我需要编写一个sqlalchemy表达式来为每个App-Type以及每个App-Version返回最高编号,因此返回的数据应该如下所示。

App-Type | App-Version | Version-Number | Description | Number

---------|-------------|----------------|------------ |---------

 Android |     Bulls   |      1.0       |    APK      |  100

 iOS     |     Bulls   |      1.0       |    plist    |  100

 Android |     Titans  |      1.0       |    APK      |  100

 iOS     |     Titans  |      1.0       |    plist    |  100

我在尝试弄清楚如何为app-version中的每个版本返回每个应用类型的最高数量时遇到很多麻烦。任何帮助将在这里非常感谢。

到目前为止我正在处理的查询是

sub_query = Table.query.order_by(desc(Table.app_version), Table.app_type, desc(Table.number))
query = sub_query.group_by(Table.app_version).group_by(Table.id).distinct(Table.app_version).all()

1 个答案:

答案 0 :(得分:2)

最简单的方法是首先找到每个appType / appVersion的最高编号(使用子查询),然后加入关于这些结果的主查询。

VI = VersionInfo  # an alias to the mapped object

# subquery
sq = (
    session
    .query(
        VI.app_type.label("app_type"),
        VI.app_version.label("app_version"),
        func.max(VI.number).label("max_number"),
    )
    .group_by(VI.app_type, VI.app_version)
).subquery("subq")

# main query
q = (
    session
    .query(VI)
    .join(sq,
          and_(
              VI.app_type == sq.c.app_type,
              VI.app_version == sq.c.app_version,
              VI.number == sq.c.max_number,
          ))
)

这里必须假设每个appType / AppVersion组合只有一个最高的数字