在 sqlalchemy 中使用 distinct()/group_by() 获取基于每个“名称”列的最新记录
Posted
技术标签:
【中文标题】在 sqlalchemy 中使用 distinct()/group_by() 获取基于每个“名称”列的最新记录【英文标题】:Using distinct()/group_by() in sqlalchemy to get latest record based for each "name" column 【发布时间】:2021-07-08 18:22:28 【问题描述】:当前表: 表名:学生
id | name | date
0 |Jones | Wed, 14 Nov 2018 18:00:00 GMT
1 |Jones | Wed, 14 Nov 2018 19:00:00 GMT
2 |Jones | Wed, 14 Nov 2018 20:00:00 GMT
3 |Su | Wed, 14 Nov 2018 01:00:00 GMT
4 |Su | Wed, 14 Nov 2018 02:00:00 GMT
5 |Su | Wed, 14 Nov 2018 03:00:00 GMT
接受表(返回每个学生的最新记录):
id | name | date
2 |Jones | Wed, 14 Nov 2018 20:00:00 GMT
5 |Su | Wed, 14 Nov 2018 03:00:00 GMT
用于上述的代码:
queryModel2 = db.session.query(student)\
.distinct(
func.min(student.date)
).all()
返回与当前表相同的东西
2ed 已应用
queryModel2= db.session.query(student).group_by(student.name).all()
返回:
0 |Jones | Wed, 14 Nov 2018 18:00:00 GMT
3 |Su | Wed, 14 Nov 2018 01:00:00 GMT
我也试过通过 asc 使用 oder,但它仍然返回与 2ed apply 相同的东西
我应该添加什么来获取每个学生的最新记录?
【问题讨论】:
您使用的是哪个 DBMS?如果是 PostgreSQL,您可以使用DISTINCT ON
与 ORDER BY
结合使用。如果是其他一些 DBMS,则例如 LEFT JOIN
会选择没有相应行且日期更高的行。
你的看起来不像一个 SQL 问题,更多的是一个与如何使用 sqlalchemy
有关的问题,我假设在 [python]
我用的是mysql,但是我想用sqlalchemy.session.query得到预期的结果
SELECT name, MAX(date) FROM student GROUP BY name
我知道如何使用sql来解决这个问题,但我不知道如何在这里应用sqlalchemy
【参考方案1】:
这是使用rank
函数的好机会:
from sqlalchemy import func
subquery = db.session.query(
func.rank().over(
order_by=student.date.desc(),
partition_by=student.name
).label('rnk'),
student
).subquery()
query = db.session.query(subquery.student)\
.filter(subquery.c.rnk == 1)\
.all()
【讨论】:
以上是关于在 sqlalchemy 中使用 distinct()/group_by() 获取基于每个“名称”列的最新记录的主要内容,如果未能解决你的问题,请参考以下文章
sqlalchemy.util._collections.result怎么处理?
如何检索 SQLAlchemy 结果集的 python 列表? [复制]