我从geofabrik.de下载了我国家的OSM数据,成功地将其导入到安装在Ubuntu 16.04上的PostgreSQL 9.6中,并多次使用。我还创建了web应用程序,它工作正常。所以我决定添加另一个功能,从某些点返回最近的特殊点(如餐厅)。对于最近的一个点,它是有效的,但是当我想要返回它们的数组时,它就不起作用了。所以我分解了我的问题,发现了奇怪的行为。当我执行以下查询时:
SELECT t.osm_id
FROM (
SELECT DISTINCT ON (a.points) a.points, v.osm_id AS osm_id, MIN(ST_DISTANCE(v.the_geom, a.points)) OVER (PARTITION BY a.points ORDER BY ST_DISTANCE(v.the_geom, a.points))
FROM (SELECT ST_GEOMFROMEWKT('SRID=4326;POINT(17.104854583740238 48.15099866770469)') AS points) a
CROSS JOIN ways_vertices_pgr v
) AS t
它返回:
| osm_id |
| ----------------- |
| 2338524511 |
当我在地图上显示这个点时,它被放置在远离原始点的地方,当我在子查询中更改点后,结果保持不变。我也知道在显示点和原始点之间有很多点,应该通过查询返回。然后我尝试运行以下查询:
SELECT t.*, t.osm_id
FROM (
SELECT DISTINCT ON (a.points) a.points, v.osm_id AS osm_id, MIN(ST_DISTANCE(v.the_geom, a.points)) OVER (PARTITION BY a.points ORDER BY ST_DISTANCE(v.the_geom, a.points))
FROM (SELECT ST_GEOMFROMEWKT('SRID=4326;POINT(17.104854583740238 48.15099866770469)') AS points) a
CROSS JOIN ways_vertices_pgr v
) AS t
它返回:
| points | osm_id | min | osm_id |
| -------------------------------------------------- | -------- | -------------------- | -------- |
| 0101000020E6100000010000C0D71A3140FFC3A1EC53134840 | 33169309 | 0.000124886435658481 | 33169309 |
除了SELECT part之外,整个查询都保持不变,但结果不同,现在它是正确的。有人能建议我如何更改查询以使其正常工作吗?
最佳答案
当您使用distinct on
时,您需要一个order by
。我认为这是第一个查询需要的逻辑:
SELECT DISTINCT ON (a.points) a.points, v.osm_id AS osm_id,ST_DISTANCE(v.the_geom, a.points) as dist
FROM (SELECT ST_GEOMFROMEWKT('SRID=4326;POINT(17.104854583740238 48.15099866770469)') AS points) a CROSS JOIN
ways_vertices_pgr v
ORDER BY a.points, dist;
关于sql - PostgreSQL 9.6中窗口功能中的不稳定查询行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47978086/