निम्न क्वेरी आपकी परिभाषा के अनुसार डेटा में अवधियों को ढूंढती है। यह निर्धारित करने के लिए पहले सहसंबद्ध उपश्रेणियों का उपयोग करता है कि क्या कोई रिकॉर्ड एक अवधि की शुरुआत है (अर्थात, पहले की समयावधि के साथ कोई ओवरलैप नहीं)। इसके बाद यह "पीरियडस्टार्ट" को सबसे हाल की शुरुआत के रूप में निर्दिष्ट करता है जो एक गैर-अतिव्यापी अवधि की शुरुआत है।
निम्नलिखित (अप्रयुक्त) क्वेरी इस दृष्टिकोण को अपनाती है:
with TimeWithOverlap as (
select t.*,
(case when exists (select * from dbo.Available tbefore where t.availStart > tbefore.availStart and tbefore.availEnd >= t.availStart)
then 0
else 1
end) as IsPeriodStart
from dbo.Available t
),
TimeWithPeriodStart as (
select two.*,
(select MAX(two1.AvailStart) from TimeWithOverlap two1 where IsPeriodStart = 1 and two1.AvailStart <= two.AvailStart
) as periodStart
from TimeWithOverlap two
)
select periodStart, MAX(AvailEnd) as periodEnd
from TimeWithPeriodStart twps
group by periodStart;
http://sqlfiddle.com/#!6/3483c/20 (दूसरी क्वेरी)
यदि दो अवधि दोनों एक ही समय में शुरू होती हैं, तो यह अभी भी काम करती है, क्योंकि AvailStart मान समान हैं। सहसंबद्ध उपश्रेणियों के कारण, यह मध्यम आकार के डेटा सेट पर भी बहुत अच्छा प्रदर्शन नहीं कर सकता है।
इस तक पहुंचने के अन्य तरीके हैं। उदाहरण के लिए, यदि आपके पास SQL Server 2012 था, तो आप संचयी योग फ़ंक्शन का उपयोग करने में सक्षम होंगे, जो एक सरल विधि प्रदान करते हैं।