首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可选择的sqlalchemy ROW_NUMBER()在(分区)上

可选择的sqlalchemy ROW_NUMBER()在(分区)上
EN

Stack Overflow用户
提问于 2020-09-01 09:48:07
回答 1查看 2K关注 0票数 0

在基于postgresql教程创建sqlalchemy WIEW表示时,我需要构造一个selectable。它一般工作得很好,但是由于它不适用于普通的query,而且必须在select上完成,所以我很难用可选的方法构造ROW_NUMBER() OVER (PARTITION BY)

我尝试过的一件事是:

代码语言:javascript
运行
复制
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))

这就变成了毫无意义的

代码语言:javascript
运行
复制
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)构建sqlalchemy selectable

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-01 19:54:51

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

代码语言:javascript
运行
复制
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)

在最初的尝试中

代码语言:javascript
运行
复制
row == 1

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63685287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档