Дана функция 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
Это может занять некоторое время в большом списке. Такое ощущение, что это может быть сделано с помощью аналитического запроса оракула в следующем виде:
min() over (
partition by zips_required.zip
order by zipdistance( zips_required.zip, zips_available.zip)
--range stuff here?
)
Единственные аналитические запросы, которые я сделал, были основаны на "row_number over (split by order by)", и с этим я ступаю в неизвестные области. Любое руководство по этому вопросу высоко ценится.