Postgres 9.1 - 获得下一个价值

los*_*rse 2 sql postgresql window-functions

我有一些数据(按"TimeStamp"排序),如下所示:

      Key     |        TimeStamp        |   Column3   |   ColumnN
--------------+-------------------------+-------------+--------------
       1      |   2012-01-01 08:00:23   |     ...     |     ...
       2      |   2012-01-01 08:01:07   |     ...     |     ...
       3      |   2012-01-01 08:02:56   |     ...     |     ...
       6      |   2012-01-01 08:02:56   |     ...     |     ...
       4      |   2012-01-01 08:03:39   |     ...     |     ...
       5      |   2012-01-01 08:04:32   |     ...     |     ...
Run Code Online (Sandbox Code Playgroud)

我需要为每条记录选择"TimeStamp" 的下一个(不仅仅是下一行).

例如,以上数据如下所示:

      Key     |          Begin          |           End           |   Column3   |   ColumnN
--------------+-------------------------+-------------------------+-------------+--------------
       1      |   2012-01-01 08:00:23   |   2012-01-01 08:01:07   |     ...     |     ...
       2      |   2012-01-01 08:01:07   |   2012-01-01 08:02:56   |     ...     |     ...
       3      |   2012-01-01 08:02:56   |   2012-01-01 08:03:39   |     ...     |     ...
       6      |   2012-01-01 08:02:56   |   2012-01-01 08:03:39   |     ...     |     ...
       4      |   2012-01-01 08:03:39   |   2012-01-01 08:04:32   |     ...     |     ...
       5      |   2012-01-01 08:04:32   |   NULL                  |     ...     |     ...
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用窗口函数,但我无法得到这个结果.有什么想法吗?

Vin*_*ard 5

甚至比dense_rank更酷,你可以使用lead窗口功能:

SELECT Key, ts, lead(ts) OVER(ORDER BY ts ASC)
FROM tbl;
Run Code Online (Sandbox Code Playgroud)

从Erwin的回答中无耻地窃取了sqlfiddle链接.

编辑:嗯,其实这是行不通的正是像你描述的,因为它不会选择一个较高值,当两个值相等.我不会删除答案,因为我认为它在这种情况下很有用,但我会将其标记为社区维基.