Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Dapatkan nilai pembaruan baris sebelumnya menggunakan LAG Tanpa menggunakan CTE Rekursif

Performa di sini mengalami rekursif CTE. CTE itu sendiri hanyalah gula sintaksis.

Hanya untuk data sampel khusus ini, ini berfungsi tanpa rekursi:

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;

Ini dapat membantu mengevaluasi kinerja, tetapi akan gagal jika di blok mana pun total Debit s melebihi total Credit s. Jika BlockTotal negatif maka harus digabungkan dengan satu atau beberapa blok berikut dan itu tidak dapat dilakukan tanpa iterasi atau rekursi.

Dalam kehidupan nyata saya akan membuang CTE3 ke tabel sementara dan menggilirnya menggabungkan blok sampai tidak ada lagi BlockTotal negatif s.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ekspor data tabel yang dimasukkan ke file .txt di server SQL

  2. tutorial pemula untuk report viewer?

  3. cara menulis fungsi angka ke kata di sql server

  4. Menyimpan HTML di SQL Server

  5. kegagalan bencana mencoba memilih dari server tertaut