WITH Range(MINDATE,TotalDays) AS (SELECT MIN(DATECOL), DATEDIFF(Day,MIN(DATECOL),MAX(DATECOL))FROM #SAMPLETABLE),CTE AS (SELECT n.number+1 AS number, ROW_NUMBER() OVER(PARTITION BY CASE WHEN s.DATECOL IS NULL THEN 1 END ORDER BY n.number) AS rn, DATEADD(Day,n.number,r.MINDATE) AS DATECOL, s.WEIGHTSFROM master.dbo.spt_values nINNER JOIN Range r ON n.number BETWEEN 0 AND r.TotalDaysLEFT OUTER JOIN #SAMPLETABLE s ON s.DATECOL = DATEADD(Day,n.number,r.MINDATE)WHERE n.type='p')SELECT a.DATECOL, COALESCE(b.WEIGHTS,a.WEIGHTS) AS WEIGHTSFROM CTE aLEFT OUTER JOIN CTE b ON a.WEIGHTS IS NULL AND b.WEIGHTS IS NOT NULL AND b.rn = a.number - a.rnORDER BY a.number;
;WITH Tally AS ( SELECT n=number FROM [master].dbo.spt_values Tally WHERE [Type] = 'P' AND Number BETWEEN 1 AND 100), MyData AS ( SELECT DATECOL, WEIGHTS ,rn=ROW_NUMBER() OVER (ORDER BY DATECOL) FROM #SAMPLETABLE )SELECT DATECOL=CASE WHEN c.DATECOL IS NULL THEN a.DATECOL ELSE c.DATECOL END , a.WEIGHTSFROM MyData aOUTER APPLY ( SELECT TOP 1 DATECOL, WEIGHTS FROM MyData b WHERE b.rn = 1 + a.rn) bOUTER APPLY ( SELECT DATEADD(day, n-1, a.DATECOL) FROM Tally WHERE DATEADD(day, n, a.DATECOL) BETWEEN a.DATECOL AND b.DATECOL) c(DATECOL)
CREATE TABLE #SAMPLETABLE(DATECOL DATETIME,WEIGHTS float) INSERT INTO #SAMPLETABLE SELECT TOP 1000 DateCol = DATEADD(mm,(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1),'1900'), Weights = RAND(CHECKSUM(NEWID()))*10 FROM sys.all_columns ac1 CROSS JOIN sys.all_columns ac2CREATE UNIQUE CLUSTERED INDEX ByDate ON #SampleTable (DateCol)
;WITH DigitsCTE AS( SELECT digit FROM (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) AS D(digit)), AllDatesCTE AS( SELECT DATEADD(DAY, N.number - 1, T.min_date) AS date FROM (SELECT MIN(T.DATECOL) AS min_date, MAX(T.DATECOL) AS max_date FROM #SAMPLETABLE AS T) AS T CROSS APPLY (SELECT TOP(DATEDIFF(DAY, T.min_date, T.max_date) + 1) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS number FROM DigitsCTE AS D0, DigitsCTE AS D1, DigitsCTE AS D2, DigitsCTE AS D3, DigitsCTE AS D4, DigitsCTE AS D5) AS N)SELECT CONVERT(varchar(20), N.date , 101) AS DATECOL, T.WEIGHTS FROM AllDatesCTE AS N CROSS APPLY (SELECT TOP(1) DATECOL, WEIGHTS FROM #SAMPLETABLE AS T WHERE T.DATECOL <= N.date ORDER BY DATECOL DESC) AS TORDER BY 1 ASC