【发布时间】:2019-11-13 18:22:37
【问题描述】:
请帮忙!
该数据库包含 WKB 格式的城市地理数据。
在d1, d2, d3(送货公司)列的每一行中,值为1 or 0。 1表示本市有送货。 0 表示没有。
如果在任何行的 d1 列中有0(没有送货),我需要找到这家公司最近(按距离)有送货的区域,并将该区域的 id 写在一个新的d1_nearest 列(如果该列已创建,则更新数据)。
同理,对于其他快递公司d2 in d2_nearest, d3 in d3_nearest。
如果设置了d1 = 1(表示该区域有投递),则d1_nearest="NULL"。
源表:
|id |name |geom |d1 |d2 |d3 |
|-----|-------|--------------|---|---|---|
|7499 |Rublevo|010300 ... B40|1 |0 |0 |
|7534 |Troitsk|010300 ... B40|1 |0 |0 |
|9629 |Maryino|010300 ... B40|1 |0 |0 |
|9937 |Vnukovo|010300 ... B40|1 |1 |0 |
|10724|Pihtino|010300 ... B40|1 |1 |0 |
|10996|Bobrovo|010300 ... B40|1 |1 |0 |
我的搜索结果是这样的:
|id |name |geom |d1 |d2 |d3 |d1_nearest|d2_nearest|d3_nearest|
|-----|-------|--------------|---|---|---|----------|----------|----------|
|7499 |Rublevo|010300 ... B40|1 |0 |0 |NULL |8248 |8248 |
|7534 |Troitsk|010300 ... B40|1 |0 |0 |NULL |9937 |10723 |
|9629 |Maryino|010300 ... B40|1 |0 |0 |NULL |9937 |10723 |
|9937 |Vnukovo|010300 ... B40|1 |1 |0 |NULL |NULL |10723 |
|10724|Pihtino|010300 ... B40|1 |1 |0 |NULL |NULL |10723 |
|10996|Bobrovo|010300 ... B40|1 |1 |0 |NULL |NULL |11022 |
等等
我这样做了,但是对于这个选项,我需要两个表。而且我还是不明白怎么给整个表做一个循环,给快递公司的每一列设置值……我不是很会编程。
请帮忙完成任务!
SELECT
t1.name As name,
t1.geom As geom,
t2.name As name,
t2.geom As geom,
ST_Distance (
ST_Transform (t1.geom :: geometry, 3857),
ST_Transform (t2.geom :: geometry, 3857)
) as dist
FROM cities11 As t1, cities10 As t2
WHERE t1.id = '7499' AND t1.id <> t2.id AND t2.d1 = '1'
ORDER BY ST_Distance (t1.geom, t2.geom)
LIMIT 1
来自this page的示例代码
很多很多谢谢!!!
【问题讨论】:
标签: postgresql postgis