python - 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
?
解决方案
在内部查询中选择行号和所需列,并在封闭查询中限制:
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 查询编译器,所以不要这样做。从中选择列。
推荐阅读
- python - 有人知道处理 Wolfram Alpha 和 Python 吗?
- r - 循环多个 if_else 语句
- c++ - 来自后台缓冲区的 glReadPixels。浮点精度问题
- ios - XCode 工作区完整性 - 无法加载项目 (pods.xcodepoj)
- r - R中的预测给出概率或分数?
- c++ - 如果未输入输入,如何将值设置为 0?C++
- oracle - 如何从 DBMS_METADATA 中删除主键?
- flutter - 每次推送新路线时,都会再次显示最后的 Flutter SnackBar
- heroku - 如何在 heroku 上部署 reactjs + nodejs(restify)+ postgresql 应用程序?
- pandas - 熊猫识别是否有任何元素在一行中