我不想聚合任何列。我只想要表中每个外键的最新行。
我尝试过分组。
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 :(得分:0)
这称为greatest-n-per-group,对于PostgreSQL,您可以使用DISTINCT ON
,如第二个示例所示:
SELECT DISTINCT ON (foreign_key_id) * FROM model ORDER BY foreign_key_id, created_at DESC;
在您的尝试中,您错过了DISTINCT ON
列表中的ORDER BY
列,因此您所要做的只是:
Model.query.order_by(Model.foreign_key_id, Model.created_at.desc()).distinct(Model.foreign_key_id)
答案 1 :(得分: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))