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

UPDATED (प्रतिक्रिया टिप्पणी करने के लिए):

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

यह खूबसूरती से काम करता है। धन्यवाद! क्या मैं इसे केवल 9:30 से 16:00 तक टाइमस्टैम्प उत्पन्न कर सकता हूं? – Aks

+0

हां, आपको कुछ संख्या संचालन करना चाहिए: 09:30 बजे प्रारंभ तिथि सेट करें, और 16:00 बजे तक मिनटों की संख्या उत्पन्न करें :) –

+0

बढ़िया! अनेक अनेक धन्यवाद! – Aks

संबंधित मुद्दे