sql - PostgreSQL 9.6 中窗口函数的不稳定查询行为

标签 sql postgresql openstreetmap postgis

我从 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        |

当我在 map 上显示这个点时,它被放置在远离原始点的位置,并且在我在子查询中更改点后,结果保持不变。我也知道显示点和原始点之间有很多点,应该通过查询返回。然后我尝试运行以下查询:

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 部分外,整个查询保持不变,但结果不同,现在是正确的。谁能建议我如何更改查询以使其正常工作?

最佳答案

当你使用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/

相关文章:

mysql - visual studio Tableadapter sql 命令错误

mysql - 如何在 SQL 中表示浮点值

sql - 如何在 BigQuery 中构建报告的热门转化路径

php - 拉拉维尔 6 : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

openlayers - OpenLayers + OpenStreetMap + 自定义 ShapeFile

postgis - osm2pgsql 窗口 "illegal option -W"错误

sql - 左连接和右表中的数据

postgresql - Sequelize throw : "relation "users"does not exist"

database - 获取在 Postgresql 中执行查询的详细信息

android - 完全困惑试图整合 map ......最好的前进方式?