我目前有一个名为cardata的数据库方案,其中包括以下列:
+-------------+-----------------------------+---------------------------------+
| tripid(int) | point geometry(point, 4326) | line geometry(linestring, 4326) |
+-------------+-----------------------------+---------------------------------+
| 1 | <data> | |
| 1 | <data> | |
point
列包含连续的GPS测量,因此我想将它们转换为线串。整个行程可以包含数千个点,但我想在每个点之间有一个线串。
我试图将此表示为update
到我的表格中,如下所示:
UPDATE cardata
SET line = ST_MakeLine(foo.point, lead)
FROM (
SELECT point, LEAD(point, 1)
OVER w
FROM cardata
GROUP BY point
WINDOW w AS (ORDER BY point)
) AS foo
WHERE lead IS NOT NULL
我的想法是,对于每一行,我使用该点,然后在第一行(ST_MakeLine
)中保存线串(line
)。这应该一直持续到行程结束,忽略LEAD
应该为空的最后一个条目。
目前我不知道如何制定区分不同tripid
的单个查询,但这是另一次。现在我只想要整个表中所有点之间的线串。
然而问题是我的查询似乎永远运行,并且不会更改表中的任何内容。我不懂为什么。我尝试测试内部SELECT
查询是否按预期运行 - 它返回46561行,共47055行。这也很奇怪,因为我认为它应该返回47054行 - 即只得出结论,对于最后一个条目,LEAD
为空。
最后,我尝试在两个随机点上运行ST_MakeLine
,这似乎工作正常。
是什么让这个查询永远运行?
答案 0 :(得分:0)
我与之合作的另一个人终于找到了一个有效的解决方案,尽管我们都不太了解原始查询究竟出了什么问题。
因此,我仍然对我原来的问题的答案感兴趣,即是什么让查询永远运行?
这是工作查询,完全按预期工作:
UPDATE cardata
SET line = resline
FROM(
SELECT tripid,
id,
ST_MakeLine(point, next_point) AS resline
FROM(
SELECT tripid,
id,
point,
lead(point) OVER w AS next_point,
lead(tripid) OVER w AS next_tripid
FROM cardata
WINDOW w AS(ORDER BY id)
) AS allcalclines
WHERE tripid = 1 AND next_tripid = tripid
) AS calclines
WHERE cardata.id = calclines.id