0

「store」タイプの建物に最も近いユーザーを計算する次のクエリがあります。

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が返されることです。これは正しくありません。私のデータでは、ID112のユーザーとストア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 に答える