2012-01-26 1 views
2

나는 발생한 날짜를 기준으로 가장 최근 이벤트를 얻어야하는 Oracle 쿼리를 작성하고 있습니다.미리 정렬 된 결과가있는 rownum을 사용하고 계급을 사용해야합니까?

필자의 테스트 케이스에서 올바르게 작동하는 것으로 보이는 두 개의 쿼리가 있습니다.

첫 번째

는 날짜 순서로 이벤트를 얻을 수있는 하위 쿼리를 사용하고 난 그냥 ROWNUM을 통해 첫 번째 레코드를 끌어 :

SELECT description FROM 
    (
    SELECT description FROM tablename 
    WHERE ((event_type IN ('A','I','Y')) AND (meeting_date IS NOT NULL) 
    AND id='whatever') 
    ORDER BY meeting_date DESC 
    ) 
    WHERE rownum = 1 

두 번째는 동일한 결과를 달성하기 위해 순위를 사용

SELECT description FROM 
(
SELECT description, RANK() OVER(ORDER BY meeting_date DESC) mtg_rank 
FROM tablename 
WHERE ((event_type IN ('A','I','Y')) AND (meeting_date IS NOT NULL) 
AND id= 'whatever') 
) 
WHERE mtg_rank = 1 

나에게 선향 된 rownum은 충분히 간단하고 나는 그것으로 갈 것이다. 나는 rownum이 일종의 정렬 전에 작동한다는 것을 깨닫습니다. 그래서 나는 subselect에서 먼저 정렬을 수행했습니다.

그러나 내가 그 생각으로 뭔가를 놓치고 있는지 확실하지 않습니다.

이 경우 순위가 권장/우수 사례인지, 아니면 쿼리의 의도를 전달하는 데 더 좋을지 궁금합니다.

+4

두 개의 검색어가 일치하는 경우 (즉, MEETING_DATE의 값이 같은 두 개의 행) 다른 검색어가 표시 될 수 있습니다. 첫 번째 쿼리는 최대 하나의 행을 반환합니다. 두 번째 쿼리는 RANK가 두 행에 대해 동일하므로 관계가있는 경우 둘 이상의 행을 반환 할 수 있습니다. ROW_NUMBER 분석 함수는 ROWNUM에 더 가깝습니다. RANK와 ROWNUM/ROW_NUMBER 중 하나를 선택하는 방법은 관계를 처리하는 방법에 따라 다릅니다. –

+0

OH : 나는 넥타이에 대해 생각하지 않았다 .... :-) – klabranche

답변

4

(Brian의 설명에서 매우 잘 설명하는) 관계가있는 경우를 제외하고 두 쿼리가 모두 작동하고 동일한 결과를 반환합니다.

개인적으로 나는 훨씬 더 적응력이 있기 때문에 개인적으로 분석 함수 접근 방식을 선호합니다. RANK, DENSE_RANKROW_NUMBER 분석 함수 사이를 스와핑하여 관계를 조정할 수 있습니다. 절을 추가하여 복수 ID 값에 대해 하나만 쿼리를 실행하려면 ID에 대한 가장 최근의 모임을 반환하는 등의 작업을 수행 할 수도 있습니다.

+0

생각할 것이 많지만 내가 찾던 답을 나에게 주었다고 믿는다. 분석 기능은이를 위해 설계되었으므로 단순한 의도만으로는 사용하는 것이 더 바람직하다고 여겨 져야합니다. 필요한 경우 관계를 처리하는 것은 말할 것도 없습니다. :-) – klabranche

관련 문제