2013-01-11 10 views
5

मुझे एक सारणी मिली है जो एमएस एसक्यूएल सर्वर में नीचे जैसा है।समूह और अन्य स्थिति पर आईडी द्वारा न्यूनतम और अधिकतम

 id | Timestamp | active 
    -----+-----------+-------- 
     1 | 1:00 | 1 
     1 | 2:00 | 1 
     1 | 3:00 | 1 
     1 | 4:00 | 0 
     1 | 5:00 | 0 
     1 | 6:00 | 1 
     1 | 7:00 | 0 
     1 | 8:00 | 0 
     1 | 9:00 | 0 
     1 | 10:00 | 1 
     1 | 11:00 | 1 
     1 | 12:00 | 0 
     1 | 13:00 | 1 
     2 | 2:00 | 1 
     2 | 3:00 | 1 
     2 | 4:00 | 0 
     2 | 5:00 | 0 
     3 | 8:00 | 0 
     3 | 9:00 | 0 
     4 | 1:00 | 1 
     4 | 2:00 | 1 
     5 | 16:00 | 0 

मुझे पता है जब प्रत्येक आईडी कितनी देर के लिए निष्क्रिय (0 सक्रिय =) था क्या अपेक्षाएं हैं। मैंने जो करने की कोशिश की वह सक्रिय = 0 पर आईडी द्वारा समूहित किया गया था, और न्यूनतम और अधिकतम समय पर एक दिनांकित किया गया था। लेकिन इससे मुझे आईडी 1 का नतीजा मिलेगा, जिसमें कहा गया था कि यह 8 घंटे (12:00 - 4:00) @ 12:00 के लिए ऑफ़लाइन था। जब मैं वास्तव में एक प्रश्न पूछता हूं जो मुझे निम्नलिखित परिणाम सेट देगा।

id | approx. offline in hours | at time 
    ---+--------------------------+----------- 
    1 |   1    | 5:00 
    1 |   2    | 9:00 
    1 |   0    | 12:00 
    2 |   1    | 5:00 
    3 |   0    | 9:00 
    5 |   0    | 16:00 

गलत क्वेरी मैं शुरू में करने की कोशिश की

SELECT id as [Inactive], 
     DATEDIFF(hour, MIN(Timestamp), MAX(Timestamp)) as [approx. offline in hours], 
     MAX(Timestamp) as [at time] 
FROM table 
WHERE active = 0 
GROUP BY [Inactive] 

है लेकिन उस क्वेरी के साथ समस्या यह है कि बीच में सक्रिय बार छोड़ देता है। मैं THIS प्रश्न देख रहा हूं जिसे पार्टिशन का उपयोग करके पूछा और उत्तर दिया गया है, लेकिन ऐसा लगता है कि सवाल काफी अलग है और उत्तर इस सवाल के लिए बहुत विशिष्ट है कि मैं इसका एहसास नहीं कर सकता।

किसी भी मदद की सराहना की है।

+0

आप किस rdbms का उपयोग कर रहे हैं? एसक्यूएल-सर्वर, ओरेकल? – Taryn

+0

@bluefeet स्क्वायर ब्रैकेट्स सबसे अधिक संभावना == SQL सर्वर –

+0

@ जोचिम इस्कसन मैं सहमत हूं लेकिन उन्हें यह बता देना चाहिए कि वे किस rdbms का उपयोग कर रहे हैं। – Taryn

उत्तर

3

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

select id, active, min(TimeStamp), max(TimeStamp) 
from (select t.*, 
      (select min(timeStamp) from t t2 where t2.id = t.id and t2.timeStamp > t.timeStamp and t2.active <> t.active 
      ) groupName 
     from t 
    ) t 
group by id, groupName, active 

एक चेतावनी कैसे आप टर्नस्टैम्प को टुरेशंस में बदलते हैं डेटाबेस पर निर्भर करता है। चूंकि आप डेटाबेस निर्दिष्ट नहीं करते हैं, इसलिए मैं आपको उस तर्क को जोड़ने दूंगा।

इसके अलावा, यदि किसी दिए गए आईडी के लिए अंतिम रिकॉर्ड निष्क्रिय है, तो समूह नाम न्यूल है। वह एक समस्या नही है।

+0

मुझे लगता है कि इस उत्तर में एक बग है, क्योंकि समूह बदलता है जब आईडी – Bulat

+0

@ बुलेट बदलता है। । । वह एक समस्या नही है। समूह समूह के लिए मान्य है और आईडी को 'समूह द्वारा' कॉलम में शामिल किया गया है। –

+0

हाँ, आप सही हैं, यह कोई समस्या नहीं है। आप फ़ील्ड नामों को सुसंगत बनाने के लिए समय पर टाइम्सस्टैम्प का नाम बदलना चाहेंगे। http://sqlfiddle.com/#!3/e5831/45/0 – Bulat

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