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

SQL सर्वर:एक दृश्य में विकल्प maxrecursion के विकल्प के लिए पुनरावर्ती CTE को फिर से लिखें

आप एक टैली का उपयोग कर सकते हैं:यह एक सेट-आधारित समाधान है, जो पुनरावृत्तियों की संख्या बढ़ने पर रिकर्सन से बेहतर प्रदर्शन करता है - और यह विचारों में समर्थित है।

यहाँ एक दृष्टिकोण है:

select t.objectid, t.amount, dateadd(day, x.n, t.begindate) as dt
from (
    select row_number() over (order by (select null)) - 1
    from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
) x(n)
inner join tabledatarange t
    on dateadd(day, x.n, t.begindate) <= case 
        when enddate <= convert(date, getdate()) then enddate
        else convert(date, getdate())
    end

टैली 0 और 999 के बीच सभी संख्याएँ उत्पन्न करती है (आप cross join जोड़कर आसानी से इसका विस्तार कर सकते हैं एस)। हम इसका उपयोग मूल तालिका की पंक्तियों को "गुणा" करने और दिनांक सीमा उत्पन्न करने के लिए करते हैं।

मैंने उस हिस्से को फिर से लिखने का प्रयास किया जो अंतिम तिथि को संभालता है। मैं समझता हूं कि आपको भविष्य की तारीखें नहीं चाहिए, इसलिए on . में यही शर्त है खंड करता है।

इस नमूना डेटा के लिए:

ObjectId | Amount | beginDate  | endDate   
-------: | -----: | :--------- | :---------
       1 |    500 | 2020-12-28 | null      
       2 |     35 | 2019-09-26 | 2019-10-01
       3 |    200 | 2020-05-28 | 2020-06-02

क्वेरी वापस आती है:

objectid | amount | dt        
-------: | -----: | :---------
       1 |    500 | 2020-12-28
       1 |    500 | 2020-12-29
       1 |    500 | 2020-12-30
       1 |    500 | 2020-12-31
       2 |     35 | 2019-09-26
       2 |     35 | 2019-09-27
       2 |     35 | 2019-09-28
       2 |     35 | 2019-09-29
       2 |     35 | 2019-09-30
       2 |     35 | 2019-10-01
       3 |    200 | 2020-05-28
       3 |    200 | 2020-05-29
       3 |    200 | 2020-05-30
       3 |    200 | 2020-05-31
       3 |    200 | 2020-06-01
       3 |    200 | 2020-06-02

डीबी फिडल पर डेमो



  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. बल्क इंसर्ट का उपयोग करते समय कुछ स्तंभों पर ध्यान न दें

  3. कार्य दिवस और कैलेंडर दिवस के साथ तालिका अद्यतन करना

  4. SQL सर्वर 2017 में अपग्रेड करने के कारण

  5. SQL सर्वर 2016:SQL स्क्रिप्ट से एक तालिका बनाएँ