繁体   English   中英

获取用户的最新记录

[英]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()

http://sqlalchemy.readthedocs.org/en/rel_1_0/core/functions.html?highlight=max#sqlalchemy.sql.functions.max

好的,我找到了一条出路,使用subquerymax函数:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM