2017-05-25 10 views
0

私はpythonでpostgresデータベースとsqlalchemyを使用しています。postgres/sqlalchemy/python:ユニオンクエリのgroup-by/max?

2つのテーブルからユニオンクエリを実行したいのですが、共通キーを持つ列の最大値を持つ行を選択したいとします。私はsqlalchemyでこの作業を行う方法を理解することができませんでした。

テーブルusersのテーブルオブジェクトとテーブルordersのテーブルオブジェクトがあるとします。

私はこのユニオンクエリを定義する方法を知っている:

union_query = union(
    select([users.c.email, users.c.timestamp]), 
    select([orders.c.email, orders.c.timestamp]) 
) 

しかし、いくつかのケースでは、timestamp値が異なるemail列共通があるかもしれません。この場合、結果は任意のemailに対して最大timestampを表示するようにします。例えば

users表は、このデータが含まれているとします

email | timestamp 
--------| --------- 
[email protected] | 00:00:00 
[email protected] | 02:03:04 
[email protected] | 10:10:10 

...とorders表は、このデータが含まれているとします

email | timestamp 
--------| --------- 
[email protected] | 12:12:12 
[email protected] | 01:01:01 
[email protected] | 09:09:09 

私は労働組合ベースの結果をしたいです次のようにクエリします。

email | timestamp 
--------| --------- 
[email protected] | 12:12:12 
[email protected] | 02:03:04 
[email protected] | 10:10:10 
[email protected] | 09:09:09 

私はされていませんgroup_by()func.max()、およびこのクエリを生成するために私のunion_queryと共に使用する他のsqlalchemy関数を適切に組み合わせることができます。

ご協力いただきありがとうございます。

答えて

1

私はだと思います。私は答えを思いつきました。エイリアスが必要で、サブクエリとしてunion_queryを使用する必要があります。

あなたはこれに間違っていると思われますか、それとももっと効率的な方法でしょうか?

union_query = union(
    select([users.c.email, users.c.timestamp]), 
    select([orders.c.email, orders.c.timestamp]) 
).alias('uq_alias') 

query = select(
      [union_query.c.email, func.max(union_query.c.timestamp)] 
     ).group_by(union_query.c.email) 

... queryを実行してください。

+1

ここで 'updated_at'カラムはどこから来たのですか? 'timestamp'という名前にする必要がありますか? –

+0

はい、 'updated_at'が間違っています。私はそれを修正しました。私は、他の変数名を使った実際のコードのより複雑な部分からこの例を構成しました。私はそれらの1つを見逃しました。 – HippoMan

関連する問題