मैं केवल एक सीटीई क्वेरी के साथ आया क्योंकि समस्या यह है कि ओवरलैपिंग समय की एक श्रृंखला हो सकती है, उदा। रिकॉर्ड 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