[英]Get the most recent record for a user
说我有这样的记录:
user_id user_data_field created
------- --------------- -------
1 some data date_a
2 some data date_b
1 some data date_c
1 some data date_d
2 some data date_e
我应该怎么做才能获得仅具有最新日期的所有用户记录(假设最新日期不是最底部的日期...可以在任何地方)? 我使用的是in_
子句中获取大宗用户sqlalchemy
:
session.query(Table).filter(Table.user_id.in_([1,2])).order_by(Table.created.desc())
只是按照创建的顺序对它们进行排序。 而且,如果我仅在此语句的末尾添加first()
子句,它将仅获得1行。 那么,我在sqlalchemy中是否有办法完成它? 谢谢。
@khan:您的解决方案几乎可以正常工作,但是该缺陷在答案的注释中有所描述。
下面的代码解决了这个特定问题(但仍然依赖于这样的事实:对于相同的user_id
不会重复created
值):
subq = (
session
.query(MyTable.user_id, func.max(MyTable.created).label("max_created"))
.filter(MyTable.user_id.in_([1, 2]))
.group_by(MyTable.user_id)
.subquery()
)
q = (
session.query(MyTable)
.join(subq, and_(MyTable.user_id == subq.c.user_id,
MyTable.created == subq.c.max_created))
)
在我看来,您要查找的SQL查询类似于:
SELECT user_id, MAX(created) FROM Table WHERE user_id IN (1, 2) GROUP BY user_id;
因此,现在的问题是使用sqlalchemy对其进行翻译,我猜想是可以做到的:
session.query(Table.user_id, func.max(Table.created)).filter(Table.user_id.in_([1,2])).group_by(Table.user_id).all()
好的,我找到了一条出路,使用subquery
和max
函数:
session.query(Table).filter(Table.user_id.in_([1,4])).\
filter(Table.created.in_(session.query(func.max(Table.created)).\
filter(Table.user_id.in_([1,4])).group_by(Table.user_id).subquery()))
以更简洁的方式,我们可以写成:
subquery = session.query(func.max(Table.created)).\
filter(Table.user_id.in_([1,4])).\
group_by(Table.user_id).\
subquery()
session.query(Table).filter(Table.user_id.in_([1,4])).filter(Table.created.in_(subq))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.