在 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 ONORDER 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:多列的不同计数

sqlalchemy.util._collections.result怎么处理?

如何检索 SQLAlchemy 结果集的 python 列表? [复制]

在SQL炼金术查询中合并相似的行

如何在 SQLAlchemy 模型中使用 SQLAlchemy Utils

如何在 SQLAlchemy 中使用 UUID?