SqlAlchemy group_by并返回最大日期

Ste*_*n G 2 python sqlalchemy greatest-n-per-group

我有一张桌子

identifier date        value
A          2017-01-01  2 
A          2017-01-02  1
A          2017-01-03  7
B          2017-01-01  2 
B          2017-01-02  7
B          2017-01-03  3
Run Code Online (Sandbox Code Playgroud)

我试图选择每个标识符的最大日期,例如我得到:

identifier date        value
A          2017-01-03  7
B          2017-01-03  3
Run Code Online (Sandbox Code Playgroud)

谢谢

r-m*_*m-n 10

使用子查询:

SELECT t1.identifier, t1.date, t1.value FROM table t1
JOIN
(
    SELECT identifier, MAX(date) maxdate
    FROM table
    GROUP BY identifier
) t2
ON t1.identifier = t2.identifier AND t1.date = t2.maxdate;
Run Code Online (Sandbox Code Playgroud)

在SQLAlchemy中:

from sqlalchemy import func, and_

subq = session.query(
    Table.identifier,
    func.max(Table.date).label('maxdate')
).group_by(Table.identifier).subquery('t2')

query = session.query(Table).join(
    subq,
    and_(
        Table.identifier == subq.c.identifier,
        Table.date == subq.c.maxdate
    )
)
Run Code Online (Sandbox Code Playgroud)


Eug*_*kin 8

使用 ORM,您可以使用over实际上是窗口函数的函数:

session \
    .query(Table, func.max(Table.date)
           .over(partition_by=Table.identifier, order_by=Table.value))
Run Code Online (Sandbox Code Playgroud)

它返回一个元组(table_instance,latest_datetime)。order_by在这种情况下是可选的。

相同的使用SQL表达式。