2012-07-12 5 views
0
에서 SELECT 쿼리의 minumum 결과를 선택

나는 내가 "저장"유형의 건물에 가장 가까운 사용자를 계산하려면 다음 쿼리가 : 나는 최소를 계산하려고 할 때PostgreSQL을

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 미터입니다.

+0

'SELECT MIN (dist) FROM y''y'는 실제 테이블 이름이어야합니다. 그렇지 않습니까? –

+0

@ DavidBélanger : CTE는 하위 쿼리에서도 볼 수 있습니다. 그래도 시작할 필요는 없습니다. –

답변

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 또는 집계 함수가 필요하지 않습니다. O (N²)을 의미한다 - 당신이 효과적으로 제한 크로스 테이블 trackbuildings 사이의 조인을 형성하기 때문에

당신은, 쿼리가 더 큰 테이블이 매우 비싸다는 것을 아마 알고 있습니다.

분명히하기 위해 명시적인 CROSS JOIN 구문 (쉼표로 구분 된 테이블 목록과 동일)을 사용했습니다.

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 

을 당신이 도움이되기를 바랍니다.
빅터 Zurita M.