SQLAlchemy:从排序多个列返回多个值

2024-06-18 13:02:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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表达式来获取每个应用程序类型和每个应用程序版本的最大值,因此返回的数据应该如下所示。在

^{pr2}$

我有很多麻烦,试图找出如何只返回应用程序版本中每个版本的每个应用程序类型的最高数字。如有任何帮助,我们将不胜感激。在

我目前正在处理的问题是

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()

Tags: 版本app应用程序byversiontablequeryapk
1条回答
网友
1楼 · 发布于 2024-06-18 13:02:57

最简单的方法是首先查找每个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组合只有一个最高的数字

相关问题 更多 >