2009-04-09 7 views
9

का पहला मामला है जब तक सभी पंक्तियों का चयन निम्न डेटा के लिए:दिया मूल्य

तारीख | मूल्य | जाँच
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1
2006 | 5 | 2005 | 5 | 2004 | 5 | 1
2003 | 5 | 1
2002 | 5 | 1

मैं वापस जाँच कॉलम में 0 की पहली आवृत्ति जब तक 2009 से सभी पंक्तियों का चयन करने की जरूरत है: | मूल्य |

तिथि की जांच
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1

मैंने अंतराल समारोह के साथ प्रयास किया, लेकिन मैं केवल एक महीने पहले जांचने में सक्षम था।

मैं ओरेकल 10 जी पर काम कर रहा हूं।

अग्रिम धन्यवाद,

अद्यतन:

सभी अच्छी तरह से काम करने लगता है, अपने परीक्षण डेटा सेट प्रदर्शन मतभेदों के बारे में कुछ भी कहने के लिए बहुत छोटा है। आपके सभी इनपुट के लिए धन्यवाद!

उत्तर

12
SELECT * FROM mytable where date > (
    SELECT max(date) FROM mytable where check = 0  
) 
3
SELECT * 
FROM (
     SELECT m.*, 
       MIN(CASE WHEN check = 0 THEN 0 ELSE 1 END) OVER (ORDER BY date DESC)) AS mn 
     FROM mytable 
     ) 
WHERE mn = 1 

या और भी बेहतर:

SELECT * 
FROM (
     SELECT m.*, ROW_NUMBER() OVER (ORDER BY mydate DESC) AS rn 
     FROM mytable m 
     ORDER BY 
       mydate DESC 
     ) 
WHERE rownum = DECODE(check, 0, NULL, rn) 
ORDER BY 
     mydate DESC 

बाद क्वेरी वास्तव में जैसे ही स्कैनिंग बंद हो जाएगा के रूप में यह जाँच में पहले शून्य का सामना करना पड़ता।

+0

यह केवल "स्कैनिंग रोक" होता अगर द्वारा एक सूचकांक, जिस स्थिति में आप के रूप में अच्छी पहले संस्करण का उपयोग कर सकते से संतुष्ट था भीतरी आदेश। अन्यथा, ओरेकल आंतरिक परिणाम सेट को पूर्ण रूप से सॉर्ट करेगा। –

+0

यकीन है कि यह होगा। लेकिन इस समाधान को कुशलता से काम करने के लिए (दिनांक) पर केवल एक सूचकांक की आवश्यकता है, जबकि MAX() समाधान को भी एक इंडेक्स (चेक, डेट) की आवश्यकता होती है। – Quassnoi

1
DECLARE @mytable TABLE (date integer, [value] integer, [check] integer) 

INSERT INTO @mytable VALUES (2009, 5, 1) 
INSERT INTO @mytable VALUES (2008, 5, 1) 
INSERT INTO @mytable VALUES (2007, 5, 1) 
INSERT INTO @mytable VALUES (2006, 5, 0) 
INSERT INTO @mytable VALUES (2005, 5, 0) 
INSERT INTO @mytable VALUES (2004, 5, 1) 
INSERT INTO @mytable VALUES (2003, 5, 1) 
INSERT INTO @mytable VALUES (2002, 5, 1) 

SELECT * 
FROM @mytable 
WHERE date > (SELECT MAX(date) FROM @mytable WHERE [Check] = 0) 
+0

सुनिश्चित नहीं है कि 'DECLARE @mytable टैबलेट' ओरेकल में काम करेगा :) – Quassnoi

+0

lol। पुरानी आदतें... –