获取每个外键ID的最新行

时间:2016-10-25 19:10:00

标签: python sqlalchemy flask-sqlalchemy

我不想聚合任何列。我只想要表中每个外键的最新行。

我尝试过分组。

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

2 个答案:

答案 0 :(得分:0)

这称为,对于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))