2016-10-19 4 views
-1

나는 XY 좌표 집합에서 가장 멀리 떨어진 곳에서 발생한 모든 목격을 검색하려고하는데 최대 거리를 부여한 이전 쿼리의 첫 번째 행을 검색 할 수있었습니다. 그러나 동일한 좌표에서 목격이 발생하면 다중 최대 값을 처리 할 수있는 기능이 없습니다.최대 값 가져 오기

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); 

그리고 :

IV는 최대 값 (들)을 얻으려고 노력에서 두 개의 서로 다른 접근 방식을 시도

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); 

첫 번째 방법이 너무 많은 값을 말하는 오류, 두 번째는 말한다 유클리드 거리에 대해 MAX()를 사용할 수 없습니다. 어떻게 극복합니까?

+0

귀하의 질문이 명확하게 표현하지 쉽게 이해되지 않는다. 당신이 무엇을 원하는지 명확히하고 사람들이 쉽게 쿼리를 얻을 수 있도록 스키마/테이블을 추가 할 수 있다면 좋을 것입니다. senario에 대해 아무 것도 모르는 사람의 관점에서 생각하십시오. –

+0

이 더 낫습니까? – 101ldaniels

+0

'sightings' 테이블의 데이터는 어디에 있습니까? 첫 번째'SELECT' 전에'WITH' 문 안에 샘플 데이터로 정의해야합니다. 그건 그렇고, 두 번째 방법은 나를 위해 작동합니다. – ozy

답변

0

그럼 첫 번째 쿼리에서 두 절을 어디에서 만들 수 있습니다. SQRT(...) = select * ...을 비교해보십시오. Select *...은 하나 이상의 값을 반환합니다. 다음에 select sighting_id, sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)을 시도하십시오. 당신은 그것을 지적해야합니다. 당신은

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)); 

또는

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)); 

에 다시 작성하거나 분석 기능을 다시 작성할 수 있습니다

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

최대한 거리를두고 싶다고 생각합니다. 아래에있는 사람과 함께 시도해보고 작동하는지 여부를 알려주시겠습니까? 위도, 2) + POWER (경도 - - 경도 (SELECT -28 AS 위도, DUAL FROM 경도 AS 151) FROM SELECT sighting_id 거리 을 (sighting_id을 선택 SQRT (POWER (북 AS PARAMS WITH

2) ) 거리 AS, MAX (SQRT (POWER (북 - 위도, 2) + POWER (LON - 경도, 2) ) ) 관찰 FROM MAX_DISTANCE AS sighting_id BY (파티션) 이상으로 PARAMS 가입 CROSS) dat 어디 dat.distance = max_distance

감사합니다,

관련 문제