使用PostgreSQL挑选随机点

时间:2019-07-24 07:49:50

标签: postgresql postgis

我正在尝试对某些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) |

值得一提的是,所有条目都有3个以上的要点可供选择。

1 个答案:

答案 0 :(得分:1)

demo:db<>fiddle

您可以使用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