2011-11-24 17 views
5

Aşağıdaki gibi sütunları olan bir veritabanım var.Sorgu dönüş değeri boşlukları doldurma

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 

Temelde, zaman damgalarına karşılık gelen değerleri saklıyorum. Bununla birlikte, eğer bir değer 0 ise, onu saklamıyorum (Gerçekten büyük bir veri tabanı ve 0 sık sık meydana gelir, bu yüzden yer kazanmak için bu satırları eklememeye karar verdik). Yukarıdaki örnekte, 12/01/2010 09:33'un 0 değeri vardır, bu nedenle kaydedilmez. Bir kullanıcı veritabanını sorgular Ancak, o

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

böyle bir şey yapar ve ben boşlukları doldurmak ve 0 değerleriyle damgaları bahsetmek gerekir. Bunu nasıl yapabilirim?

+2

kesinlikle veritabanında yerine istemci tarafında bunu yapmak gerekiyor mu? –

+0

Sıfır kaydetmemeye nasıl karar verirsiniz? - Bunu değiştiremezsiniz, bu nedenle zaman damgası sütununu etkilemez veya 00/00/0000/00:00 – Rob

+0

@JonSkeet'i umuyoruz. Alternatif önerilere açığım. Neyin işe yaradığını görmek isterim. – Aks

cevap

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 

GÜNCELLEME (Yorum yapmak yanıt):

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

Bu güzel çalışıyor. Teşekkürler! Saat 09:30 ile 16:00 arasında zaman damgaları oluşturabilir miyim? – Aks

+0

evet, bazı numara işlemleri yapmalısınız: başlangıç ​​tarihini saat 09: 30'a ayarlayın ve 16: 00'a kadar dakika sayısını oluşturun :) –

+0

Harika! Teşekkürler bir ton! – Aks