문제
두 개의 우편 번호와 다음 테이블 사이의 거리 (마일)를 계산하는 기능 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
- 각각
zip_required
까지의 거리를 계산하십시오zip_available
멀리서 분류하십시오 - 각각
zip_required
그만큼count
~와 함께range
얼마나 많은지 알 수 있습니다zip_availables
그 거리의 반경에 있습니다. - 필터 (먼저 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_available
S는보다 작습니다 N
.
주어진 지퍼 (Easy Math : <or> NSWE RADIUS)에서 제곱 반경 내에 ZIP의 서브 세트를 작성하여 동일한 문제를 해결 한 다음 필요한 반경 내에 있는지 확인하기 위해 서브 세트의 각 항목을 반복합니다. 매력처럼 일했고 매우 빠릅니다.
나는 오래된 프로젝트 중 하나에서 부분적으로 비슷한 요구 사항을 가졌습니다. 미국의 2 개의 우편 번호 사이의 거리를 계산합니다. 같은 것을 해결하기 위해 나는 우리 공간 데이터를 잘 활용했습니다. 기본적으로 접근 방식은 소스 우편 코드 (위도, 경도) 및 대상 우편 번호 (위도, 경도)를 얻는 것이 었습니다. 이제 위의 거리를 기준으로 거리를 얻기 위해 함수를 적용했습니다. 이 계산을 수행하는 데 도움이되는 기본 공식은 다음 사이트나는 또한 언급함으로써 결과를 검증했다 이 지역...
참고 : 그러나 이것은 대략적인 거리를 제공하므로 이에 따라 사용할 수 있습니다. 결과를 가져 오기 위해 혜택은 초고속으로 구성되었습니다.