Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SqlAlchemy group_by和返回最大日期_Python_Sqlalchemy_Greatest N Per Group - Fatal编程技术网

Python SqlAlchemy group_by和返回最大日期

Python SqlAlchemy group_by和返回最大日期,python,sqlalchemy,greatest-n-per-group,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 我正在尝试选择每个标识符的最大日期,例如我得到: identifier date value A

我有一张这样的桌子

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
我正在尝试选择每个标识符的最大日期,例如我得到:

identifier date        value
A          2017-01-03  7
B          2017-01-03  3
感谢您使用子查询:

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;
在炼金术中:

from sqlalchemy import func, and_

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

query = session.query(Table).join(
    subq,
    and_(
        Table.c.identifier == subq.c.identifier,
        Table.c.date == subq.c.maxdate
    )
)
使用ORM,您可以使用实际上是窗口函数的函数:

session \
    .query(Table, func.max(Table.date)
           .over(partition_by=Table.identifier, order_by=Table.value))
它返回一个元组(table_instance,latest_datetime)<在这种情况下,代码>订购人是可选的


在orm中,您可以像在mysql中一样编写它

result = session.query(Table,func.max(Table.date)).group_by(Table.identifier)
for row,i in result:
    print(row.date,row.value,row.identifier,i)

这是一个非常常见的问题,并产生了自己的标记:。试着搜索一下。解决方案可能有点特定于数据库,所以请至少提供这些信息。@IljaEverilä我看到了,但sql alchemy(python等价物)没有等价物,我知道这是不真实的。下面是一个Postgresql解决方案,例如:,尽管它缺少标记。在SQLA中实现简单的SQL解决方案也相当简单。@IljaEverilä不确定在您所指的问题中您在哪里看到了group by。我的SQL技能非常差(完全公开),合并一个半相似的解决方案并使其作为一个子句在任何地方都不起作用并不总是容易的,因为它使用了Postgresql特有的独特的。。。按组合排序,以高效地实现每组最大n。搜索SQL解决方案确实令人望而生畏,如果不熟悉术语的话。