Biorąc funkcją zipdistance (zipfrom, zipto), który oblicza odległość (w milach) pomiędzy dwoma kody pocztowe i poniższych tabelach:Oracle Analityczne Pytanie
create table zips_required(
zip varchar2(5)
);
create table zips_available(
zip varchar2(5),
locations number(100)
);
Jak można skonstruować kwerendę, która będzie zwracać się do mnie każdy kod pocztowy z tabeli zips_required i minimalna odległość, która wytworzy sumę (lokalizacje)> = n.
Do tej pory przeprowadziliśmy wyczerpującą analizę pętli dla każdego promienia, dopóki nie spełnimy kryteriów.
--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
Może to chwilę potrwać na dużej liście. Czuje się jak można to zrobić z wyrocznią analitycznej zapytania wzdłuż linii:
min() over (
partition by zips_required.zip
order by zipdistance(zips_required.zip, zips_available.zip)
--range stuff here?
)
Jedyne analitycznych zapytań I zrobili zostały „row_number nad (partycję)” zamówienia przez w oparciu, a ja kroczenie w nieznane obszary. Wszelkie wskazówki na ten temat są bardzo doceniane.
Myślę, że jest blisko. W twoim przykładzie, rn będzie po prostu rankingiem odległości między 2 zamkami zamawianymi przez odległość. Potrzebuję tylko zipdistance ostatniego z tej listy, którego suma lokalizacji plus wszystkie poprzednie lokalizacje jest większa lub równa N. –
@ Jos: to zwróci odległość najdalszej lokalizacji z najbliższą N. Czy tego nie chcesz? – Quassnoi
limit 1 w zapytaniu Oracle? Coś przeoczyłem. – tuinstoel