Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 加入窗口函数以显示与ID相关的下一个日期_Sql_Postgresql_Window Functions - Fatal编程技术网

Sql 加入窗口函数以显示与ID相关的下一个日期

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

我正在整理一个查询,但我正在努力加入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
    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