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

ओवरलैप को अनदेखा करते हुए कुल मिनट खोजें (CTE में कर्सर आधारित उत्तर बदलें)

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

निम्नलिखित (अप्रयुक्त) क्वेरी इस दृष्टिकोण को अपनाती है:

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 था, तो आप संचयी योग फ़ंक्शन का उपयोग करने में सक्षम होंगे, जो एक सरल विधि प्रदान करते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर क्वेरी:पंक्तियाँ कॉलम बनाती हैं (धुरी?)

  2. sql सर्वर में वर्तमान डेटाटाइम से पिछले 7 दिनों तक पिछले 7 दिनों का डेटा कैसे प्राप्त करें?

  3. स्कीमा को नहीं छोड़ा जा सकता, क्योंकि यह मौजूद नहीं है या आपके पास अनुमति नहीं है। - SQL सर्वर / TSQL ट्यूटोरियल भाग 29

  4. SQL सर्वर:GROUP BY में केवल अंतिम प्रविष्टि

  5. SQL सर्वर में नामकरण मानकों या नामकरण सम्मेलन के अनुसार सभी डिफ़ॉल्ट बाधाओं का नाम कैसे बदलें - SQL सर्वर / TSQL ट्यूटोरियल भाग 93