2016-11-10 75 views
1

返回多個值我有一個postgres DB保持結構這樣的數據:SQLAlchemy的:從排序多列

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版本,所以返回的數據應該看起來像這樣。

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 

我有很多的麻煩試圖找出如何爲每個應用型只返回最多爲應用程序版本每個版本。任何幫助將不勝感激。

我工作的截止到目前爲止,該查詢

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

請問你的數據結構(第一臺)有任何其他的唯一標識符(主鍵)? – van

+0

id是主鍵,它是一個整數。 –

回答

1

最簡單的方法是,首先找到每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組合數量最多

+0

我最終自己想出了這個,但你提供的答案與我所做的幾乎相同。謝謝您的幫助! –