2016-09-02 4 views
0

내 쿼리 데이터를 반환과 같은 :최근 날짜가있는 행을 반환하려면 어떻게해야합니까?

ID | ProcessID | Type| Value | Date 
-------------------------------------------------- 
1 |  2  | A | 10 | 2/23/2016 10:10:42 AM 
1 |  2  | B | 20 | 2/23/2016 10:10:42 AM 
1 |  2  | C | 30 | 2/23/2016 10:10:42 AM 
2 |  4  | A | 10 | 7/21/2016 11:28:22 AM 
2 |  4  | B | 20 | 7/21/2016 11:28:22 AM 
2 |  4  | C | 30 | 7/21/2016 11:28:22 AM 
:

ID | ProcessID | Type| Value | Date 
-------------------------------------------------- 
1 |  2  | A | 10 | 2/23/2016 10:10:42 AM 
1 |  2  | B | 20 | 2/23/2016 10:10:42 AM 
1 |  2  | C | 30 | 2/23/2016 10:10:42 AM 
1 |  1  | A | 11 | 1/6/2016 12:48:04 PM 
1 |  1  | B | 21 | 1/6/2016 12:48:04 PM 
1 |  1  | C | 31 | 1/6/2016 12:48:04 PM 
2 |  4  | A | 10 | 7/21/2016 11:28:22 AM 
2 |  4  | B | 20 | 7/21/2016 11:28:22 AM 
2 |  4  | C | 30 | 7/21/2016 11:28:22 AM 
2 |  3  | A | 11 | 6/21/2016 09:41:07 AM 
2 |  3  | B | 21 | 6/21/2016 09:41:07 AM 
2 |  3  | C | 31 | 6/21/2016 09:41:07 AM 

그러나, 나는 정말로 단지 내 복귀는 다음과 같이 것이라고 이러한 유형의 A, B 및 C에 대한 가장 최근의 데이터를 얻을 관심

select 절에서 max를 사용해 보았지만 작동하지 않습니다.

select f.folderrsn,fpi.processrsn,fpi.infocode, fpi.infovalue, fp.enddate 
from folderprocessinfo fpi 
join folderprocess fp on fp.processrsn = fpi.processrsn 
join folder f on f.folderrsn = fp.folderrsn 
where fpi.infocode in (51437,51438,51439) 
and trunc(f.issuedate) > '01-JAN-16' 
and not fpi.infovalue is null 
and f.folderrsn = 11179547 --limited to one "ID" for example 
order by fp.enddate asc 

반환 :

"FOLDERRSN","PROCESSRSN","INFOCODE","INFOVALUE","ENDDATE" 
"11179547","37159700","51437","91","6/2/2015 10:27:46 AM" 
"11179547","37159700","51438","0","6/2/2015 10:27:46 AM" 
"11179547","37159700","51439","145.5","6/2/2015 10:27:46 AM" 
"11179547","37540455","51437","91","7/24/2015 6:44:08 AM" 
"11179547","37540455","51438","0","7/24/2015 6:44:08 AM" 
"11179547","37540455","51439","145.5","7/24/2015 6:44:08 AM" 

답변

2

당신은 row_number()을 사용할 수 있습니다 여기에

는 실제 수익의 샘플과 함께 한 "ID"를 예를 위해 제한 내 SQL입니다 :

with f as (
     select f.folderrsn, fpi.processrsn, fpi.infocode, 
      fpi.infovalue, fp.enddate 
     from folderprocessinfo fpi join 
      folderprocess fp 
      on fp.processrsn = fpi.processrsn join 
      folder f 
      on f.folderrsn = fp.folderrsn 
     where fpi.infocode in (51437, 51438, 51439) and 
      trunc(f.issuedate) > '01-JAN-16' and 
      fpi.infovalue is not null 
    ) 
select f.* 
from (select f.*, 
      row_number() over (partition by processid, type order by enddate desc) as seqnum 
     from f 
    ) f 
where seqnum = 1 
order by enddate asc; 
+0

고든, 고든. 저는 SQL을 처음 사용하기 때문에 개선 할 방법을 찾고 있습니다. 당신은 경험이있는 것 같습니다. 가독성을 위해 괄호의 첫 번째 집합에서 사용한 것처럼 내 쿼리의 서식을 지정 하시겠습니까? –

+0

이것은 해결책이 아닙니다. 각 processrsn (processid), 각 infocode (type)에 대해 하나씩 정확히 3 행의 데이터를 가져와야합니다. 한 번에 하나의 정보를 쿼리하여 데이터를 얻을 수는 있지만 운동을 위해서 다른 아이디어가 있습니까? –

+0

@Chris : 질문을 편집하여 요구 사항을 명확하게하십시오. 방금 "processid"에 대해 언급 한 내용은 질문에 명확하게 언급되거나 설명되지 않았습니다. – sstan

관련 문제