0

我有以下查询,我想计算最接近“商店”类型建筑物的用户:

WITH y AS (
  SELECT t.userid as us, ST_Distance(t.thegeometry,b.thegeomtry) as dist
  FROM track t,buildings b
  WHERE b.type = 'store'
)
SELECT us 
FROM   y
WHERE  dist = (SELECT MIN(dist) FROM y)

问题是当我试图计算最小值时,它给了我 0 这是不正确的。在我的数据中,ID 为 112 的用户与商店 A 之间的最小距离等于 2441 米。

4

2 回答 2

2

您的查询应该如下所示:

SELECT t.userid AS us
      ,ST_Distance(t.thegeometry, b.thegeomtry) AS dist
FROM   track t
CROSS  JOIN buildings b
WHERE  b.type = 'store'
ORDER  BY dist 
LIMIT  1;

“找到离任何类型商店最近的用户”。
不需要 CTE 或聚合函数。

您可能知道查询对于较大的表非常昂贵,因为您有效地在表之间形成了有限的交叉连接track-buildings这意味着O(N²)

我使用了显式CROSS JOIN语法(相当于以逗号分隔的表列表)来说明这一点。

于 2012-07-12T17:13:17.827 回答
1

我假设 ST_Distance 是一个返回数字的函数,然后尝试使用以下查询:

SELECT
 t.userid AS us
,MIN (ST_Distance(t.thegeometry,b.thegeomtry)) AS dist
FROM track t, buildings b
WHERE b.type = 'store'
GROUP BY t.userid
ORDER BY 2
LIMIT 1

我希望你能帮忙。
维克多·祖里塔 M.

于 2012-07-12T15:23:58.157 回答