sql - 在 Postgres 中使用连接指定窗口函数
问题描述
我在 Postgres 中使用此 SQL 命令出现语法错误,但它似乎与SELECT 文档中指定的命令语法相匹配
select *,
row_number() over w
from units
left outer join leases
window w AS (partition by units.id order by leases.start desc)
据我所见,这与我可以编写任何形式的 SQL 语句的语法相匹配:
SELECT *
from (table joins)
WINDOW window_name AS (window_definition)
leases
然而 SQL 告诉我and之间有一个错误window
。有什么错误?为什么我误读了文档?
这是错误:
2020-03-27 23:02:11.644 PDT [47717] ERROR: syntax error at or near "WINDOW" at character 66
2020-03-27 23:02:11.644 PDT [47717] STATEMENT: select *, row_number() over w from units left outer join leases WINDOW w AS (partition by units.id order by leases.start desc)
ERROR: syntax error at or near "WINDOW"
LINE 1: ...umber() over w from units left outer join leases WINDOW w A...
^
为了澄清我的问题,我对其进行了编辑,以实际将窗口函数添加到 SELECT 列表中,尽管根据 Postgresql SQL 规范,这不是必需的。无论如何,添加函数并不能解决语法错误。它仍然在同一个地方。
解决方案
正如 hwnn 所评论的那样,由于您使用了 WINDOW,您的 sql 并没有出错,这是因为您没有为连接添加任何谓词
select *,
row_number() over w
from
units u
left outer join leases l on u.id = l.unitid
-- ^^^^^^^^^^^^^^^^^^
window w AS (partition by u.id order by l.start desc)
如果您的目标是提高您的 sql 知识,您可能希望跳过使用 WINDOW 子句,因为(据我所知)并非所有 DBMS 都支持它;当有更常用的实施变体可用时,学习仅由某些供应商实施的语法对您来说是不必要的限制
select *,
row_number() over (partition by u.id order by l.start desc)
from
units u
left outer join leases l on u.id = l.unitid
推荐阅读
- r - 在非连续时间序列中找到某个时间范围内的最大值
- ios - 属性字符串下划线不适用于外部字体
- azure - Azure IoT 中心:使用 MQTT 和 SDK 的云到设备消息传递
- ibm-streams - 如何获取 IBM Streams 工具包更新?
- android - onRequestPermissionsResult() 在 Activity 而非 Fragment 中触发
- python - 通过列索引获取值,其中行是特定值
- python - AttributeError:“FileDataset”对象没有属性“SliceLocation”
- android - 如何将每个文件(不仅是位图)编码为 base64?
- rest - SABRE 的 Create Pnr API 中的 Air Price 对象歧义
- css - CSS:如何检测缺口的位置?