我有一个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()
答案 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组合只有一个最高的数字