首页 > 解决方案 > sqlalchemy ROW_NUMBER() OVER (PARTITION BY) 可选

问题描述

postgresql WIEW在根据教程创建 sqlalchemy表示时,我需要构建一个selectable. 它一般工作得很好,但由于它不能正常工作query并且必须重新完成select,我遇到ROW_NUMBER() OVER (PARTITION BY)了可选择的构建困难。

我尝试过的一件事:

row = select([func.row_number().over(partition_by=Table.cals_id,                                  
order_by=desc(Table.parsing_timestamp))]).alias('row')

q = (select([Table.listing_id,
             Table.date,
             Table.price,
             row])
             .where(row ==1))

这转化为无意义

SELECT table.listing_id, table.date, table.price, (SELECT row_number() OVER (PARTITION BY table.cals_id ORDER BY table.parsing_timestamp DESC) AS row 
 FROM table) AS row 
WHERE 0 = 1

如何构建ROW_NUMBER() OVER (PARTITION BY)with sqlalchemy selectable

标签: pythonsqlalchemy

解决方案


在内部查询中选择行号和所需列,并在封闭查询中限制:

sq = select([
    Table.listing_id,
    Table.date,
    Table.price,
    func.row_number().over(
        partition_by=Table.cals_id,
        order_by=desc(Table.parsing_timestamp)).label('rn')]).alias()

q = select([sq.c.listing_id,
            sq.c.date,
            sq.c.price]).where(sq.c.rn == 1)

在最初的尝试中

row == 1

row是别名子查询,而不是标量子查询,因此它没有有意义的相等性覆盖。它会问一张桌子是否等于一个。由于它不会覆盖相等性来生成 SQL,因此表达式在 Python 中进行评估并生成False. 将对象本身作为列传递Alias似乎会以各种有趣的方式触发 SQLAlchemy 查询编译器,所以不要这样做。从中选择列。


推荐阅读