【发布时间】:2015-09-01 21:10:30
【问题描述】:
我有这样的数据:
table1
_____________
id way time
1 1 00:01
2 1 00:02
3 2 00:03
4 2 00:04
5 2 00:05
6 3 00:06
7 3 00:07
8 1 00:08
9 1 00:09
我想知道我在哪个时间段内走哪条路:
desired output
_________________
id way from to
1 1 00:01 00:02
3 2 00:03 00:05
6 3 00:06 00:07
8 1 00:08 00:09
我尝试使用窗口函数:
SELECT DISTINCT
first_value(id) OVER w AS id,
first_value(way) OVER w as way,
first_value(time) OVER w as from,
last_value(time) OVER w as to
FROM table1
WINDOW w AS (
PARTITION BY way ORDER BY ID
range between unbounded preceding and unbounded following);
我得到的是:
ID way from to
1 1 00:01 00:09
3 2 00:03 00:05
6 3 00:06 00:07
这是不正确的,因为在 1 路我不是从 00:01 到 00:09。 是否有可能按照顺序进行分区,意味着只分组以下相等的属性?
【问题讨论】:
-
way200:03 - 00:05和way300:06-00:07怎么样?这非常令人困惑。 -
错了,我修好了。谢谢。
-
你让它看起来像
id和time两者都将严格平行上升。是这样吗?你确定吗?如果id是serial列,则很可能不是总是如此。这意味着一个时间片的最小值id和最小值time可能位于不同的行中。那么结果应该是什么? -
不,他们不是。 id 严格按照我开车经过的顺序升序。但是不需要唯一,有些路的开始和结束时间是一样的(结束时间基本上就是下一个路的开始时间,例子中没有显示),理论上下一行的开始时间可以在之前(以及结束时间)。我从 GPS 轨道的地图匹配到 Openstreetmap 网络获取数据。这些方法的顺序是正确的。但是,我通过加入最近邻 GPS 点将时间戳分配给边缘,这可能会导致错误。
标签: sql postgresql greatest-n-per-group window-functions gaps-and-islands