Sql 加入窗口函数以显示与ID相关的下一个日期
我正在整理一个查询,但我正在努力加入POSTGRESQL中窗口函数生成的序列Sql 加入窗口函数以显示与ID相关的下一个日期,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我正在整理一个查询,但我正在努力加入POSTGRESQL中窗口函数生成的序列 SELECT e.start_time, ne.start_time, e.end_time FROM (SELECT e.ID, e.start_time, e.end_time, ROW_NUMBER() OVER (PARTITION BY e.ID ORDER BY e.start_time) AS "SEQ" FROM events e )e
SELECT e.start_time, ne.start_time, e.end_time
FROM
(SELECT e.ID, e.start_time, e.end_time, ROW_NUMBER() OVER (PARTITION BY e.ID ORDER BY e.start_time) AS "SEQ"
FROM events e
)e
LEFT JOIN
(SELECT ne.ID, ne.start_time, ne.end_time, ROW_NUMBER() OVER (PARTITION BY ne.ID ORDER BY ne.start_time) AS "nSEQ"
FROM events ne
)ne
ON e.ID = ne.ID
AND e.SEQ = ne.nSEQ - 1
在SQL server中,这本可以做得很好,但出于某种原因,POSTGRESQL似乎不喜欢这种加入方式。有人能建议另一种方法吗
我希望看到前一个事件和下一个事件在同一行上相对于ID开始,您没有告诉我们您得到的错误,但我猜这是关于无效标识符的问题 您将带引号的标识符(=case敏感的)与不带引号的标识符(=case不敏感的)混合使用 根据(以及SQL标准的要求),
“nSEQ”
是与nSEQ
不同的名称。我的建议是:从所有SQL语句中完全删除双引号,这样就永远不会有问题
以下几点应该可以很好地发挥作用:
SELECT e.start_time, ne.start_time, e.end_time
FROM (
SELECT e.ID, e.start_time, e.end_time,
ROW_NUMBER() OVER (PARTITION BY e.ID ORDER BY e.start_time) AS SEQ --<< no quotes!
FROM events e
) e
LEFT JOIN (
SELECT ne.ID, ne.start_time, ne.end_time,
ROW_NUMBER() OVER (PARTITION BY ne.ID ORDER BY ne.start_time) AS nSEQ --<< no quotes
FROM events ne
) ne ON e.ID = ne.ID AND e.SEQ = ne.nSEQ - 1;
您不能只使用LEAD(开始时间)OVER(按ID分区按开始时间排序)?这会提供相对于同一行上的ID的下一个开始时间吗?应该是的。类似于:
从事件中选择start\u time、LEAD(start\u time)OVER(按ID顺序按start\u time划分)、end\u time代码>我不确定您之前遇到了什么错误,但可能是因为您使用了双引号。如果你在一个地方使用它们,你将需要在任何地方使用它们,因此你的连接条件应该是和e“SEQ”=ne。“nSEQ”-1
,但使用lead还是更好。你会遇到什么错误?@Jeremy fantastic更简单
SELECT e.start_time,
lead(e.end_time) over (PARTITION BY e.ID ORDER BY e.start_time) as next_end_time,
e.end_time,
FROM events e