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解决方案确实令人望而生畏,如果不熟悉术语的话。