在基于postgresql
教程创建sqlalchemy WIEW
表示时,我需要构造一个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)
构建sqlalchemy
selectable
发布于 2020-09-01 19:54:51
在内部查询中选择行号和所需列,并在封闭查询中进行限制:
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
是一个别名子查询,而不是标量子查询,因此它对等式没有有意义的覆盖。它会问一张桌子是否等于1。由于它不覆盖生成SQL的相等性,所以表达式将在Python中进行计算并生成False
。将Alias
对象本身作为列传递似乎以各种有趣的方式干扰了SQLAlchemy查询编译器,所以不要。从其中选择列。
https://stackoverflow.com/questions/63685287
复制相似问题