2016-10-25 3 views
0

カラムを集約したくありません。私はちょうどテーブルの各外部キーのための最新の行をしたい。各外部キーIDの最新のローを取得

私はグループ化を試みました。

Model.query.order_by(Model.created_at.desc()).group_by(Model.foreign_key_id).all() 
# column "model.id" must appear in the GROUP BY clause 

私は別に試しました。

Model.query.order_by(Model.created_at.desc()).distinct(Model.foreign_key_id).all() 
# SELECT DISTINCT ON expressions must match initial ORDER BY expressions 

答えて

0

これはとして知られており、PostgreSQLのために、あなたの第二の例のように、DISTINCT ONを使用することができます。

SELECT DISTINCT ON (foreign_key_id) * FROM model ORDER BY foreign_key_id, created_at DESC; 

あなたの試みで、あなたはそう、あなたのORDER BYリストにDISTINCT ON列を欠落していました

Model.query.order_by(Model.foreign_key_id, Model.created_at.desc()).distinct(Model.foreign_key_id) 
+0

このソリューションは、私が投稿したものよりも速いのですか? –

+0

@ColtonAllen一般的には、はい、少しです。詳細については、[この回答](http://stackoverflow.com/a/7630564/341730)を参照してください。 – univerio

0

解決策は、エイリアスモデルを自分自身に結合することです(特別な結合条件)。次に、idを持たない行を除外します。

model = Model 
aliased = aliased(Model) 
query = model.query.outerjoin(aliased, and_(
    aliased.primary_id == model.primary_id, 
    aliased.created_at > model.created_at)) 
query = query.filter(aliased.id.is_(None)) 
関連する問題