यह बल्कि जटिल है। यहाँ विंडो फ़ंक्शंस का उपयोग करने का एक तरीका है।
सबसे पहले, सप्ताहांत के बिना तिथियों की गणना करने के लिए दिनांक तालिका का उपयोग करें (यदि आप चाहें तो छुट्टियां भी निकाल सकते हैं)। फिर, गैर-इक्विजॉइन का उपयोग करके, अवधियों को प्रति दिन एक दिन में विस्तारित करें।
फिर आप क्रमिक दिनों की पहचान करने के लिए एक तरकीब का उपयोग कर सकते हैं। यह चाल प्रत्येक आईडी के लिए अनुक्रमिक संख्या उत्पन्न करने और तिथियों के अनुक्रमिक संख्या से घटाने के लिए है। यह क्रमिक दिनों के लिए स्थिर है। अंतिम चरण केवल एक एकत्रीकरण है।
परिणामी क्वेरी कुछ इस प्रकार है:
with d as (
select d.*, row_number() over (order by date) as seqnum
from dates d
where day not in ('Saturday', 'Sunday')
)
select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration)
from (select t.*, ds.seqnum, ds.date,
(d.seqnum - row_number() over (partition by id order by ds.date) ) as grp
from table t join
d ds
on ds.date between t.startdate and t.enddate
) t
group by t.id, grp;
संपादित करें:
इस पर संस्करण निम्न है एसक्यूएल फिडल:
with d as (
select d.*, row_number() over (order by date) as seqnum
from datetable d
where day not in ('Saturday', 'Sunday')
)
select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration)
from (select t.*, ds.seqnum, ds.date,
(ds.seqnum - row_number() over (partition by id order by ds.date) ) as grp
from (select t.*, 'abc' as id from table1 t) t join
d ds
on ds.dateid between t.startdate and t.enddate
) t
group by grp;
मेरा मानना है कि यह काम कर रहा है, लेकिन दिनांक तालिका में सभी तिथियां नहीं हैं।