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

सप्ताह के दिनों के लिए पंक्तियों को क्लब करने के लिए

यह बल्कि जटिल है। यहाँ विंडो फ़ंक्शंस का उपयोग करने का एक तरीका है।

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

फिर आप क्रमिक दिनों की पहचान करने के लिए एक तरकीब का उपयोग कर सकते हैं। यह चाल प्रत्येक आईडी के लिए अनुक्रमिक संख्या उत्पन्न करने और तिथियों के अनुक्रमिक संख्या से घटाने के लिए है। यह क्रमिक दिनों के लिए स्थिर है। अंतिम चरण केवल एक एकत्रीकरण है।

परिणामी क्वेरी कुछ इस प्रकार है:

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;

मेरा मानना ​​है कि यह काम कर रहा है, लेकिन दिनांक तालिका में सभी तिथियां नहीं हैं।




  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 कीवर्ड की तरह दिखने वाले SQL कॉलम नामों से कैसे निपटें?

  2. SQL सर्वर फ़ेलओवर क्लस्टर - सक्रिय नोड निर्धारित करें

  3. एसक्यूएल 2008 - वर्कर (अधिकतम) बनाम टेक्स्ट डेटा प्रकार

  4. एक सीमांकित कॉलम को एक अलग तालिका में विभाजित करने के लिए कुशल क्वेरी

  5. एसक्यूएल सर्वर में 'एक्सएमएल' आयात करें