2014-06-25 3 views
0

테이블에서 두 번째 최신 날짜를 검색하려고합니다. 예를 들어 내 테이블이라고 생각하면 다음과 같습니다.테이블에서 두 번째 최신 날짜를 검색하는 방법

COL1| COL2| COL3 
--------------------- 
A | 1 | 25-JUN-14 
B | 1 | 25-JUN-14 
C | 1 | 25-JUN-14 
A | 1 | 24-JUN-14 
B | 1 | 24-JUN-14 
C | 1 | 24-JUN-14 
A | 1 | 23-JUN-14 
B | 1 | 23-JUN-14 
C | 1 | 23-JUN-14 

내가 원하는 결과를 얻을 수있는이 쿼리를 만듭니다 (두 번째 최신 날짜).

SELECT sub.COL1, sub.COL2, MAX(sub.COL3) 
FROM (SELECT t.COL1, t.COL2, t.COL3 
    FROM test t 
    GROUP BY t.COL1, t.COL2, t.COL3 
    HAVING MAX(t.COL3) < (
         SELECT MAX(COL3) 
         FROM test sub 
         WHERE sub.COL1=t.COL1 AND sub.COL2=t.COL2 
         GROUP BY COL1, COL2)) sub 
GROUP BY sub.COL1, sub.COL2; 

두 번째 최신 날짜를 얻으려면 여러 중첩 된 하위 쿼리를 사용하는 크고 지저분한 성명을 볼 수 있습니다. 나는이 문제가 아니라 내 문제에 대한 우아한 해결책을 배우고 싶다. 당신의 도움을 주셔서 감사합니다 .. :)

PS를 : 나는 명령 '로'사용할 수 없습니다입니다 .. :(

답변

1

당신을 이 같은 시도 할 수 있습니다 : -

SELECT col1, col2, MAX(col3) 
FROM TEST 
WHERE col3 < (SELECT MAX(col3) 
       FROM tab1) 
GROUP BY col1, col2; 

Sql Fiddle Demo

+1

이것은 깨끗하고 간단하다. 도대체 내가 어떻게 생각하지 않았는가 : s Thanks btw .. :) – Sas

4

만약 내가 제대로 이해하고, 당신이 할 수 있습니다

select t.* 
from (select t.*, 
      dense_rank() over (order by col3 desc) as seqnum 
     from test t 
    ) t 
where seqnum = 2; 
+0

이이 awes입니다 오메 솔루션. 나는 새로운 것을 오늘 배웠다 (Rank/dense_rank) .. XD – Sas

관련 문제