Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

ओवरलैपिंग समय अंतराल को समतल/विलय करें

मैं केवल एक सीटीई क्वेरी के साथ आया क्योंकि समस्या यह है कि ओवरलैपिंग समय की एक श्रृंखला हो सकती है, उदा। रिकॉर्ड 1 रिकॉर्ड 2 के साथ ओवरलैप करता है, रिकॉर्ड 2 रिकॉर्ड 3 के साथ और इसी तरह। सीटीई या किसी अन्य प्रकार के लूप आदि के बिना इसे हल करना कठिन है। कृपया इसे वैसे भी दें।

सीटीई क्वेरी के पहले भाग में वे सेवाएं मिलती हैं जो एक नया समूह शुरू करती हैं और उनके पास किसी अन्य सेवा के समान प्रारंभिक समय नहीं होता है (मुझे समूह शुरू करने वाला केवल एक रिकॉर्ड होना चाहिए)। दूसरा भाग उन्हें मिलता है जो एक समूह शुरू करते हैं लेकिन एक ही प्रारंभ समय के साथ एक से अधिक है - फिर से, मुझे उनमें से केवल एक की आवश्यकता है। अंतिम भाग सभी अतिव्यापी सेवाओं को लेते हुए, प्रारंभिक समूह पर पुनरावर्ती रूप से बनता है।

यह रहा SQLFiddle विभिन्न प्रकार के ओवरलैपिंग और डुप्लिकेट समय को प्रदर्शित करने के लिए और अधिक रिकॉर्ड जोड़े गए हैं।

मैं ServiceID का उपयोग नहीं कर सका जैसा कि इसे उसी तरह से ऑर्डर करना होगा जैसे BeginTime

;with flat as
(
 select StaffID, ServiceDate, BeginTime, EndTime, BeginTime as groupid 
 from services S1
 where not exists (select * from services S2 
 where S1.StaffID = S2.StaffID 
 and S1.ServiceDate = S2.ServiceDate 
 and S2.BeginTime <= S1.BeginTime and S2.EndTime <> S1.EndTime
 and S2.EndTime > S1.BeginTime)

  union all

  select StaffID, ServiceDate, BeginTime, EndTime, BeginTime as groupid 
  from services S1
 where exists (select * from services S2 
 where S1.StaffID = S2.StaffID 
 and S1.ServiceDate = S2.ServiceDate 
 and S2.BeginTime = S1.BeginTime and S2.EndTime > S1.EndTime)
   and not exists (select * from services S2 
 where S1.StaffID = S2.StaffID 
 and S1.ServiceDate = S2.ServiceDate 
 and S2.BeginTime < S1.BeginTime
 and S2.EndTime > S1.BeginTime)

 union all

 select S.StaffID, S.ServiceDate, S.BeginTime, S.EndTime, flat.groupid 
 from flat
 inner join services S 
 on flat.StaffID = S.StaffID
 and flat.ServiceDate = S.ServiceDate
 and flat.EndTime > S.BeginTime
 and flat.BeginTime < S.BeginTime and flat.EndTime < S.EndTime
)

select StaffID, ServiceDate, MIN(BeginTime) as begintime, MAX(EndTime) as endtime 
from flat
group by StaffID, ServiceDate, groupid
order by StaffID, ServiceDate, begintime, endtime


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. खोजों का एक अवलोकन नवीनतम डेटाबेस निगरानी सेवा - स्पॉटलाइट क्लाउड

  2. तालिका का स्कीमा नाम कैसे प्राप्त करें?

  3. SELECT COUNT(*) की तुलना में SELECT COUNT(कॉलम) तेज/धीमा है?

  4. टीएसक्यूएल राउंड अप दशमलव संख्या

  5. एसक्यूएल सर्वर में सर्कुलर डिपेंडेंट टेबल कैसे खोजें?