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

रिकर्सिव सीटीई का उपयोग किए बिना एलएजी का उपयोग करके पिछली पंक्ति अद्यतन मूल्य प्राप्त करें

यहां प्रदर्शन पुनरावर्ती . से प्रभावित है सीटीई। CTE अपने आप में सिंटैक्टिक शुगर है।

बस इस विशेष नमूना डेटा के लिए यह बिना रिकर्सन के काम करता है:

Declare @Tbl as Table(SNO Int,Credit Money,Debit Money,PaidDate Date)
Insert into @Tbl
SELECT * FROM (VALUES (1,0,12,'7Jan16'), (2,10,0,'6Jan16'), (3,15,0,'5Jan16'), (4,0,5,'4Jan16'), (5,0,3,'3Jan16'), (6,0,2,'2Jan16'), (7,20,0,'1Jan16')) AS X(SNO,Credit,Debit,PaidDate);

With CTE1 As (
    Select *
      , CASE WHEN Credit > 0 THEN LEAD(1 - SIGN(Credit), 1, 1) OVER (ORDER BY SNO) ELSE 0 END As LastCrPerBlock
    From @Tbl
), CTE2 As (
    Select *
      , SUM(LastCrPerBlock) OVER (ORDER BY SNO DESC ROWS UNBOUNDED PRECEDING) As BlockNumber
    From CTE1
), CTE3 As (
    Select *
      , SUM(Credit - Debit) OVER (PARTITION BY BlockNumber) As BlockTotal
      , SUM(Credit - Debit) OVER (PARTITION BY BlockNumber ORDER BY SNO ROWS UNBOUNDED PRECEDING) As BlockRunningTotal
    From CTE2
)
Select SNO, Credit, Debit
  , CASE WHEN BlockRunningTotal < 0 THEN -BlockRunningTotal ELSE 0 END As TotalDebit
  , CASE WHEN BlockRunningTotal > 0 THEN CASE WHEN Credit < BlockRunningTotal THEN Credit ELSE BlockRunningTotal END ELSE 0 END As Amount
  , PaidDate
From CTE3
Order By SNO;

यह प्रदर्शन का मूल्यांकन करने में मदद कर सकता है, लेकिन यह विफल हो जाएगा यदि किसी भी ब्लॉक में कुल Debit . है s कुल Credit . से अधिक है एस। अगर BlockTotal नकारात्मक है तो इसे एक या कई निम्नलिखित ब्लॉकों के साथ विलय कर दिया जाना चाहिए और यह पुनरावृत्ति या पुनरावृत्ति के बिना नहीं किया जा सकता है।

वास्तविक जीवन में मैं CTE3 को अस्थायी तालिका में डंप कर दूंगा और उस पर तब तक विलय कर दूंगा जब तक कि कोई और नकारात्मक BlockTotal न हो। एस.



  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 Server 2008 स्कीमा निर्दिष्ट करने का कोई तरीका है?

  2. सामान्य तालिका अभिव्यक्ति, अर्धविराम क्यों?

  3. SQL सर्वर ब्लॉकिंग क्वेरी

  4. नेटिव मोड में SQL रिपोर्टिंग सर्विसेज 2008 का धीमा स्टार्टअप

  5. SQL सर्वर में पूर्णांकों के varchar निरूपण की तुलना (<>) के साथ अंतर्निहित रूपांतरण कैसे काम करता है?