문제

두 개의 우편 번호와 다음 테이블 사이의 거리 (마일)를 계산하는 기능 zipdistance (Zipfrom, Zipto)가 주어지면 :

create table zips_required(
   zip varchar2(5)
);

create table zips_available(
   zip varchar2(5),
   locations number(100)
);

zips_required 테이블에서 각 우편 번호와 합 (위치)> = n을 생성하는 최소 거리에서 나에게 반환하는 쿼리를 어떻게 구성 할 수 있습니까?

지금까지 우리는 기준을 충족 할 때까지 각 반경에 대해 철저한 루프 쿼리를 실행했습니다.

--Do this over and over incrementing the radius until the minimum requirement is met
select count(locations) 
from zips_required zr 
left join zips_available za on (zipdistance(zr.zip,za.zip)< 2) -- Where 2 is the radius

큰 목록에서 시간이 걸릴 수 있습니다. 다음은 다음의 라인을 따라 Oracle Analytic Query로 수행 할 수 있다고 생각합니다.

min() over (
  partition by zips_required.zip 
  order by zipdistance( zips_required.zip, zips_available.zip)
  --range stuff here?
) 

내가 한 유일한 분석 쿼리는 "row_number over (partition by by)"기반으로, 나는 이것으로 알려지지 않은 영역으로 밟고 있습니다. 이에 대한 지침은 대단히 감사합니다.

도움이 되었습니까?

해결책

이것이 제가 생각해 낸 것입니다.

SELECT zr, min_distance
  FROM (SELECT zr, min_distance, cnt, 
               row_number() over(PARTITION BY zr ORDER BY min_distance) rnk
           FROM (SELECT zr.zip zr, zipdistance(zr.zip, za.zip) min_distance,
                         COUNT(za.locations) over(
                             PARTITION BY zr.zip 
                             ORDER BY zipdistance(zr.zip, za.zip)
                         ) cnt
                    FROM zips_required zr
                   CROSS JOIN zips_available za)
          WHERE cnt >= :N)
 WHERE rnk = 1
  1. 각각 zip_required 까지의 거리를 계산하십시오 zip_available 멀리서 분류하십시오
  2. 각각 zip_required 그만큼 count ~와 함께 range 얼마나 많은지 알 수 있습니다 zip_availables 그 거리의 반경에 있습니다.
  3. 필터 (먼저 count (위치)> n)

샘플 데이터를 만들었습니다.

INSERT INTO zips_required
   SELECT to_char(10000 + 100 * ROWNUM) FROM dual CONNECT BY LEVEL <= 5;

INSERT INTO zips_available
   (SELECT to_number(zip) + 10 * r, 100 - 10 * r FROM zips_required, (SELECT ROWNUM r FROM dual CONNECT BY LEVEL <= 9));

CREATE OR REPLACE FUNCTION zipdistance(zipfrom VARCHAR2,zipto VARCHAR2) RETURN NUMBER IS
BEGIN
   RETURN abs(to_number(zipfrom) - to_number(zipto));
END zipdistance;
/

메모: 귀하의 질문에서 Count (위치) 및 Sum (위치)을 사용했습니다. Count (위치)라고 가정했습니다.

다른 팁

SELECT  *
FROM    (
        SELECT  zip, zd, ROW_NUMBER() OVER (PARTITION BY zip ORDER BY rn DESC) AS rn2
        FROM    (
                SELECT  zip, zd, ROW_NUMBER() OVER (PARTITION BY zip ORDER BY zd DESC) AS rn
                FROM    (
                        SELECT  zr.zip, zipdistance(zr.zip, za.zip) AS zd
                        FROM    zips_required zr
                        JOIN    zips_available za
                        )
                )
        WHERE   rn <= n
        )
WHERE   rn2 = 1

각각 zip_required, 이것은 적합한 최소 거리를 선택합니다. N zip_available숫자 인 경우 최대 거리 zip_availableS는보다 작습니다 N.

주어진 지퍼 (Easy Math : <or> NSWE RADIUS)에서 제곱 반경 내에 ZIP의 서브 세트를 작성하여 동일한 문제를 해결 한 다음 필요한 반경 내에 있는지 확인하기 위해 서브 세트의 각 항목을 반복합니다. 매력처럼 일했고 매우 빠릅니다.

나는 오래된 프로젝트 중 하나에서 부분적으로 비슷한 요구 사항을 가졌습니다. 미국의 2 개의 우편 번호 사이의 거리를 계산합니다. 같은 것을 해결하기 위해 나는 우리 공간 데이터를 잘 활용했습니다. 기본적으로 접근 방식은 소스 우편 코드 (위도, 경도) 및 대상 우편 번호 (위도, 경도)를 얻는 것이 었습니다. 이제 위의 거리를 기준으로 거리를 얻기 위해 함수를 적용했습니다. 이 계산을 수행하는 데 도움이되는 기본 공식은 다음 사이트나는 또한 언급함으로써 결과를 검증했다 이 지역...

참고 : 그러나 이것은 대략적인 거리를 제공하므로 이에 따라 사용할 수 있습니다. 결과를 가져 오기 위해 혜택은 초고속으로 구성되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top