2011-11-24 53 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

你如何決定不存儲零? - 你不能改變這個,所以它不會影響時間戳列,或者你想排除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