2010-08-10 2 views
1

Oracle 데이터베이스에서 요청을 실행 중입니다.SQL에서 maxvalue 또는 nullvalue를 반환하는 방법은 무엇입니까?

ID ELEMENT_ID BEGIN_DATE END_DATE 
-------------------------------------------- 
1  1    01/01/2007 01/06/2007 
2  1    01/06/2007 

3  2    01/01/2006 01/07/2006 
4  2    01/07/2006 31/12/2006 

END_DATE가 작성되지 않은 시간 슬롯이 여전히 있음을 의미합니다 : 내 테이블의 하나는 요소 시간 슬롯을 포함하고 있으며, 다음의 예와 올바른되도록 같은 요소에 대한 몇 가지 시간 슬롯이있을 수 있습니다 실행 중입니다 (요소의 가장 최근 시간 슬롯입니다).

따라서 각 요소에 대해 가장 최근의 END_DATE을 검색 할 때 # 2와 # 4 행을 가져 오려고합니다. 그래서 내가 직면하고있는 문제는 NULL을 가장 높은 것으로 생각하는 것입니다. END_DATE ...

단일 SQL 요청으로이 작업을 수행 할 수 있습니까? 물론

나는 간단한 시도 :

SELECT MAX(END_DATE) FROM ...

을하지만 때문에 NULL 값의 한 정도로 아니다.

미리 감사드립니다.

답변

6

변화는 어떤 미래 가치에 null 값 시도

SELECT MAX(NVL(END_DATE,SYSDATE + 1) ... 
+0

이 아무도 것으로 가정하여 end_dates는 미래에 있으며 이는 귀하의 예를 기반으로합니다. – LesterDove

+0

이 경우 내 end_dates는 앞으로도 존재하지 않습니다. 스 니펫을 주셔서 감사합니다, 그것은 잘 작동합니다! 그러나, 나의 다음 단계는 식별 된 MAX (END_DATE)에 대한 전체 행을 선택하기 때문에 마지막으로 조금 문제가 있습니다 ... 그래서'END_DATE'에 가짜 날짜를 삽입하는 것은 더 이상' SELECT *에서 MyTable 어디 END_DATE = (SELECT MAX (...));'나를위한 마지막 팁 ?? :) – Clem

+0

기술적으로 사과를 사과와 비교하고 비교의 양면에서 널을 대체하는 한 당신의 접근 방식은 효과가 있습니다. SELECT * FROM MyTable WHERE NVL (END_DATE, SYSDATE + 1) = (SELECT MAX (. ..)); 아마도 다른 방법이 많이 있습니다 ... – LesterDove

3

:

select element_id, max(coalesce(end_date, date '4000-12-31')) as max_end_date 
from ... 
3

가 FIRST null로의 명령에 의한 사용은, 예를 들면 :

SELECT DISTINCT 
     FIRST_VALUE(id) 
     OVER (PARTITION BY element_id 
      ORDER BY end_date DESC NULLS FIRST) latest_id, 
     element_id, 
     FIRST_VALUE(begin_date) 
     OVER (PARTITION BY element_id 
      ORDER BY end_date DESC NULLS FIRST) latest_id, 
     FIRST_VALUE(end_date) 
     OVER (PARTITION BY element_id 
      ORDER BY end_date DESC NULLS FIRST) latest_id 
FROM ... 


ID ELEMENT_ID BEGIN_DATE END_DATE 
-------------------------------------------- 
2  1    01/06/2007 
4  2    01/07/2006 31/12/2006 
+0

그레이트 솔루션! 나는 이전 코드를 코딩했지만 다음 번에 당신의 방법을 염두에 두라. 감사. – Clem

관련 문제