sql >> Database >  >> RDS >> Sqlserver

SQL Server:herschrijf recursieve CTE om de optie maxrecursion in een weergave te vervangen

Je zou een telling kunnen gebruiken:dat is een set-gebaseerde oplossing, die beter presteert dan recursie wanneer het aantal iteraties toeneemt - en het wordt ondersteund in weergaven.

Hier is een benadering:

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

De telling genereert alle getallen tussen 0 en 999 (u kunt deze eenvoudig uitbreiden door cross join toe te voegen s). We gebruiken het om de rijen van de originele tabel te "vermenigvuldigen" en het datumbereik te genereren.

Ik heb geprobeerd het deel te herschrijven dat de einddatum behandelt. Ik begrijp dat je geen datums in de toekomst wilt, dus dat is de voorwaarde in de on clausule wel.

Voor deze voorbeeldgegevens:

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

De vraag retourneert:

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

Demo op DB Fiddle



  1. MySQL-trigger:voor invoegen of na invoegen

  2. MySQL GROUP door Regex?

  3. Bereken het tijdsverschil tussen twee rijen

  4. Is het mogelijk om een ​​specifieke ORDER BY te selecteren in SQL Server 2008?