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;
我有下面的例子 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;