Postgresql如何按时间查找集合中的最大值和最小值

Postgresql How to Find Maximum and Minimum Value in A set Order by Time

我有下面的例子 table 按时间排序:

Example Table

我想计算一个区域的最大时间和最小时间。

如果我使用 max(Time) over (partition by Area),它会得到以下结果:

Unwanted Results

问题是 - 对于 Strathfield,我使用的将获得所有 Strathfield 行的最大和最小时间。

我希望组或分区的设置方式是 -

第1-6行为一组;第7-11行是一组;第12行是一组;第13行是一组;第14行是一组;第15行是一组;第16-19行是一组;第20-27行是一组。

然后我可以计算每组的最大和最小时间。

预期结果如下:

Expected Results

这在 Postgresql 中可行吗?我该如何实现?谢谢

这是一个间隙和孤岛问题,一种方法是使用行数差异法:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Time) rn1,
              ROW_NUMBER() OVER (PARTITION BY Area ORDER BY Time) rn2
    FROM yourTable
)

SELECT Time, Area,
       MAX(Time) OVER (PARTITION BY Area, rn1 - rn2) AS MaxTime,
       MIN(Time) OVER (PARTITION BY Area, rn1 - rn2) AS MinTime
FROM cte
ORDER BY Time;