我正在尝试对一些 OSM 道路进行地理编码,并且创建了一个包含 500 条道路样本的表格。所有道路都是多线串。我使用 ST_DumpPoints 创建了另一个表,所以现在我又多了一个包含道路信息的表,其中每个条目都是单条道路的单个点。初始样本表中的 500 条记录已变成 48000 条。我想创建第三个表,其中一条道路上有三个随机点。
积分表:
| gid | number | path | path1 | path2 | geom | text_geom |
|-------|--------|--------|-------|-------|------|------------|
| 39559 | 49 | {1,1} | 1 | 1 | ... | POINT(x y) |
| 39559 | 49 | {1,2} | 1 | 2 | ... | POINT(x y) |
| 39559 | ... | ... | ... | ... | ... | ... |
| 39559 | 49 | {1,79} | 1 | 79 | ... | POINT(x y) |
| 15168 | Null | {1,1} | 1 | 1 | ... | POINT(x y) |
| 15168 | Null | {1,2} | 1 | 2 | ... | POINT(x y) |
| 15168 | ... | ... | ... | ... | ... | ... |
| 15168 | Null | {1,43} | 1 | 43 | ... | POINT(x y) |
注意:有些条目有 1800 点可供选择。该表只是为了展示它的样子。
我想要的表格:
| gid | number | path | path1 | path2 | geom | text_geom |
|-------|--------|-------|-------|-------|------|------------|
| 39559 | 49 | {1,1} | 1 | 1 | ... | POINT(x y) |
| 39559 | 49 | {1,2} | 1 | 2 | ... | POINT(x y) |
| 39559 | 49 | {1,3} | 1 | 3 | ... | POINT(x y) |
| 15168 | Null | {1,1} | 1 | 1 | ... | POINT(x y) |
| 15168 | Null | {1,2} | 1 | 2 | ... | POINT(x y) |
| 14005 | 460 | {1,1} | 1 | 1 | ... | POINT(x y) |
| 14005 | 460 | {1,2} | 1 | 2 | ... | POINT(x y) |
| 14005 | 460 | {1,3} | 1 | 3 | ... | POINT(x y) |
另外值得一提的是,所有参赛作品都有超过三个点可供选择。
最佳答案
您可以使用row_number() window function它以特定的顺序为组中的每个记录生成连续的数字。我猜,该组就是您的 gid
,按照顺序,您可以简单地采用 random()
值。
我用一个更简单的表格演示了这一点:myroad
是您的 gid
,mypoint
是您的 text_geom
列b :
SELECT
myroad,
mypoint
FROM (
SELECT
*,
row_number() OVER (PARTITION BY myroad ORDER BY random())
FROM
points
) s
WHERE row_number <= 3
关于postgresql - 使用 PostgreSQL 选择随机点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57177827/