如何在以下查询中过滤row_number == 1:
query = session.query(Foo, func.row_number().over(
partition_by=Foo.foo_field, order_by=desc(Foo.foo_date_time)).label("row_number"))
query = query.filter(Foo.time_key <= time_key)
# query = query.filter(row_number == 1)
result = query.all()
答案 0 :(得分:19)
我找到了它:
row_number_column = func.row_number().over(partition_by=Foo.foo_field, order_by=desc(Foo.foo_date_time)).label('row_number')
query = self.session.query(Foo)
query = query.filter(Foo.time_key <= time_key)
query = query.add_column(row_number_column)
query = query.from_self().filter(row_number_column == 1)
答案 1 :(得分:1)
也可以使用子查询来完成:
sshd_config
通过将row_number添加为列,它基本上会生成等效的SQL语句。
编译语句。
sub_query = session.query(
Foo,
func.row_number().over(partition_by=Foo.foo_field, order_by=desc(Foo.foo_date_time)).label("row_number")
)
sub_query = sub_query.filter(Foo.time_key <= time_key).subquery()
query = session.query(sub_query).filter(sub_query.c.row_number == 1)
将生成以下内容:
sub_query = session.query(
Foo,
func.row_number().over(partition_by=Foo.foo_field, order_by=desc(Foo.foo_date_time)).label("row_number")
)
sub_query = sub_query.filter(Foo.time_key <= time_key).subquery()
query = session.query(sub_query).filter(sub_query.c.row_number == 1)
str(query.statement.compile())