Postgres/Postgis 数据库 - 使用 ST_MakeLine 无限查询 运行

Postgres/Postgis database - Query running infinitely with ST_MakeLine

我目前有一个名为 cardata 的数据库方案,其中包括这些列:

+-------------+-----------------------------+---------------------------------+
| tripid(int) | point geometry(point, 4326) | line geometry(linestring, 4326) |
+-------------+-----------------------------+---------------------------------+
| 1           | <data>                      |                                 |
| 1           | <data>                      |                                 |

point 列包含连续的 GPS 测量值,因此我想将它们转换为线串。整个行程可以包含数千个点,但我想要每个点之间的线串。

我试图将其表述为我的 table 的 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 应该为 null 的条目。

目前我不知道如何制定区分不同 tripid 的单个查询,但那是以后的事了。现在我只想要整个 table.

中所有点之间的线串

然而,问题是我的查询似乎永远 运行,并且不会更改 table 中的任何内容。我不懂为什么。我尝试测试内部 SELECT 查询是否按预期运行 - 它 returns 46561 行,共 47055 行。这也很奇怪,因为我认为它应该 return 47054 行 - 即仅得出结论,对于最后一个条目,LEAD 为空。

最后我尝试了 运行在两个随机点上 ST_MakeLine,这似乎工作正常。

是什么让这个查询永远 运行?

与我一起工作的另一个人终于找到了一个可行的解决方案,尽管我们都不太明白原始查询到底出了什么问题。

因此,我仍然对我最初问题的答案感兴趣,即 什么使查询 运行 永远如此?

这是工作查询,完全按预期工作:

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