2016-10-19 2 views
-1

Im Versuch, alle Sichtungen abzurufen, die am weitesten von einer Reihe von XY-Koordinaten entfernt sind, konnte ich die erste Zeile in einer vorherigen Abfrage abrufen, die den maximalen Abstand angibt. Es war jedoch nicht in der Lage, mehrere Maximalwerte zu verarbeiten, wenn Sichtungen an den gleichen Koordinaten auftraten.Ermitteln des Maximalwerts

Iv versucht, zwei verschiedene Ansätze bei Versuch, den Maximalwert (s) zu erhalten:

WITH params as (
      SELECT -28 as lat, 151 as lon 
      FROM dual 
     ) 
    SELECT sighting_id, sqrt(power(lat - latitude, 2) + power(lon - longitude, 2) 
    ) 
    AS distance 

    FROM sightings CROSS JOIN params 

    WHERE sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) = 
    (select * from (select sighting_id, 
     sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) 

    FROM sightings CROSS JOIN params 

    ORDER BY sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) desc) 

    WHERE rownum <= 1); 

Und:

WITH params as (
       SELECT -28 as lat, 151 as lon 
       FROM dual 
      ) 
     SELECT sighting_id, sqrt(power(lat - latitude, 2) + power(lon - longitude, 2) 
     ) 
     AS distance 

     FROM sightings CROSS JOIN params 

     WHERE sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) = 
     (SELECT MAX(sqrt(power(lat - latitude, 2) + power(lon - longitude, 2))) 

     FROM sightings CROSS JOIN params); 

der erste Fehler Art und Weise zu viele Werte zu sagen, und die zweiten sagt Ich kann den MAX() über den euklidischen Abstand nicht benutzen. Wie überwinde ich das?

+0

Ihre Frage ist nicht eindeutig ausgedrückt und nicht leicht zu verstehen. Bitte erklären Sie, was Sie tun möchten, und es wäre auch großartig, wenn Sie das Schema/die Tabellen hinzufügen könnten, damit die Leute Ihre Anfrage leicht bekommen. Denken Sie aus der Perspektive einer Person, die nichts über das Senario weiß. –

+0

ist das besser? – 101ldaniels

+0

Wo sind die Daten der Sichtungs-Tabelle? Sie sollten es mit einigen Beispieldaten innerhalb der 'WITH'-Anweisung vor dem ersten' SELECT' definieren. Übrigens funktioniert dein zweiter Weg für mich. – ozy

Antwort

0

Nun in der ersten Abfrage machen Sie zwei Fehler in Where-Klausel. Sie versuchen, SQRT(...) = select * ... zu vergleichen. Select *... gibt mehr als einen Wert zurück. Als nächstes versuchen Sie select sighting_id, sqrt(power(lat - latitude, 2) + power(lon - longitude, 2) aus dem Nichts. Du solltest es zeigen. YOu umschreiben kann es zu

WITH params as (
     SELECT -28 as lat, 151 as lon 
     FROM dual 
    ) 
SELECT sighting_id, 
     sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) AS distance 
FROM sightings 
CROSS JOIN params 
WHERE sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) = 
(select max_value 
    from (select sqrt(power(lat - latitude, 2) + power(lon - longitude, 2) as max_value 
     FROM sightings CROSS JOIN param 
     order by sqrt(power(lat - latitude, 2) + power(lon - longitude, 2) desc) 
    where rownum <=1) 
ORDER BY sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) desc)); 

oder

WITH params as (
     SELECT -28 as lat, 151 as lon 
     FROM dual 
    ) 
SELECT sighting_id, 
     sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) AS distance 
FROM sightings 
CROSS JOIN params 
WHERE sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) = 
(select max(sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) 
    FROM sightings CROSS JOIN param) 
ORDER BY sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) desc)); 

oder umschreiben es mit analytischer Funktion

WITH params as (
     SELECT -28 as lat, 151 as lon 
     FROM dual 
    ) 
select sighting_id, 
     distance 
from (
SELECT sighting_id, 
     sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) AS distance 
     , dense_rank() over (order by sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) desc) as rnk 
FROM sightings 
CROSS JOIN params) 
where rnk = 1; 
0

Wie ich verstehe, möchten Sie die maximale Entfernung nehmen. kannst du bitte mit unter einem versuchen und mich wissen lassen ob es funktioniert oder nicht?

MIT params AS (SELECT -28 AS lat, 151 AS lon FROM DUAL) SELECT sighting_id, Entfernung FROM (SELECT sighting_id, SQRT (POWER (lat - Breite, 2) + POWER (lon - Länge , 2) ) als Distanz, MAX (SQRT (POWER (lat - Breite, 2) + POWER (lon - Länge, 2) ) ) OVER (PARTITION BY sighting_id) AS MAX_DISTANCE FROM Sichtungen JOIN CROSS params ) dat WHERE dat.distance = max_distance

Grüße, Niraj

Verwandte Themen