Python SQLAlchemy:返回按列的最大值筛选的记录

Python SQLAlchemy:返回按列的最大值筛选的记录,python,sqlalchemy,Python,Sqlalchemy,总之,我对SQLA请求有问题目标是返回计数器列中具有最大值的记录: 这工作正常-返回正确的记录: m=12 # arbitrary example of a max value of counter = 12 qry = session.query(Data). filter(Data.user_id == user_id,Data.counter == m) 下面的代码不起作用-返回None: from sqlalchemy import func qry = session.q

总之,我对SQLA请求有问题目标是返回计数器列中具有最大值的记录:

这工作正常-返回正确的记录:

m=12 # arbitrary example of a max value of counter = 12
qry = session.query(Data).
      filter(Data.user_id == user_id,Data.counter == m)
下面的代码不起作用-返回
None

from sqlalchemy import func
qry = session.query(Data).
      filter(Data.user_id == user_id,
      Data.counter == func.max(Data.counter).select())
请注意,永远不会有多个记录具有最大值(如果相关)


当然,有一种方法可以返回其中一列中具有最大值的记录。有什么想法吗?

听起来你可以简单地按计数器降序排序,然后得到第一个结果

from sqlalchemy import desc

qry = session.query(Data).filter(
      Data.user_id == user_id).order_by(
      desc(Data.counter).limit(1)
但是,如果您关心对大型数据集进行排序,可以使用子查询

subqry = session.query(func.max(Data.counter)).filter(Data.user_id == user_id)
qry = session.query(Data).filter(Data.user_id == user_id, Data.counter == subqry)
qry
的sql基本上是

SELECT * 
FROM data 
WHERE data.user_id = :user_id AND data.counter = (
    SELECT max(data.counter) AS max_1 
    FROM data 
    WHERE data.user_id = :user_id GROUP BY data.user_id
);

这并不是非常节省资源,而是查找一个max并检索一条记录,最终我们将对整个(可能很长)列表进行排序。正在寻找更高效的方法。编辑以显示使用子查询的替代方法。也可以使用,但我不确定如何用SQLAlchemy干净地表达。子查询可能更高效吗?在我看来,它将添加处理—数据已经按计数器列排序以获得最大值,然后它必须扫描表以找到匹配的项。使用
max
应该不会像排序那样昂贵。看见