2011-11-24 4 views
5

다음과 같은 열이있는 데이터베이스가 있습니다.쿼리 반환 값의 채우기 간격이

Id Date    Value 
1 12/01/2010 09:30 127.31 
1 12/01/2010 09:31 133.41 
1 12/01/2010 09:32 147.54 
1 12/01/2010 09:34 155.66 

기본적으로 타임 스탬프에 해당하는 값을 저장합니다. 그러나 값이 0이면 저장하지 않습니다 (실제로는 큰 데이터베이스이고 0은 자주 발생하므로 공간을 절약하기 위해이 행을 포함하지 않기로 결정했습니다). 위의 예에서 12/01/2010 09:33은 0 값을 가지므로 저장되지 않습니다. 그러나 사용자가 데이터베이스에 쿼리하면 그는

select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY')` 

과 같은 작업을 수행하며 간격을 채우고 타임 스탬프에 0 값을 언급해야합니다. 어떻게해야합니까?

+2

당신은 확실히 데이터베이스가 아닌 클라이언트 측에서이 작업을 수행해야합니까? –

+0

어떻게 0을 저장하지 않기로 결정하셨습니까? - 타임 스탬프 열에 영향을 미치지 않거나 00/00/0000/00:00 인 타임 스탬프를 제외하고 싶다면 이것을 변경할 수 있습니까? – Rob

+0

@ JonSkeet, 잘하면. 나는 대안을 제안합니다. 나는 무엇이 작동하는지보고 싶다. – Aks

답변

8
select 
    nvl(b.id,1) as id, 
    alldates.Date as Date, 
    nvl(b.value,0) as value 
from 
    (select level/1440 + to_date('12/01/2010', 'MM/DD/YYYY') as Date 
     from dual 
     connect by level < 1440 --one day 
    ) alldates 
    left join 
    (select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY') b 
    on alldates.Date = b.Date 

업데이트] (의견을 응답) :

select 
    nvl(b.id,1) as id, 
    alldates.Date as Date, 
    nvl(b.value,0) as value, 
    nvl(b.value, lag(b.value) over (order by b.Date nulls last)) last_valid_value 
from 
    (select level/1440 + to_date('12/01/2010', 'MM/DD/YYYY') as Date 
     from dual 
     connect by level < 1440 --one day 
    ) alldates 
    left join 
    (select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY') b 
    on alldates.Date = b.Date 
+0

이것은 아름답게 작동합니다. 감사! 09:30에서 16:00까지만 타임 스탬프를 생성 할 수 있습니까? – Aks

+0

예, 숫자 작업을 수행해야합니다. 시작 날짜를 09:30으로 설정하고 16:00까지 분 수를 생성하십시오. –

+0

좋습니다! 엄청 고마워! – Aks

관련 문제