По сути, нам нужно разделить строки на группы 12
, и для каждой группы увеличить месячную часть новой даты. Строки в каждой группе должны быть упорядочены, и нам нужно увеличить дневную часть каждой новой даты на единицу.
Вы можете использовать ROW_NUMBER
, чтобы упорядочить строки и разделить их на группы. Затем вы можете использовать DATEADD
для построения новой даты для каждой строки:
DECLARE @DataSource TABLE
(
[DATE] DATETIME2(0)
,[AMOUNT] INT
);
INSERT INTO @DataSource ([DATE], [AMOUNT])
VALUES ('2019-04-01', 100)
,('2019-04-02', 100)
,('2019-04-03', 100)
,('2019-04-04', 100)
,('2019-04-05', 100)
,('2019-04-06', 100)
,('2019-04-07', 100)
,('2019-04-08', 100)
,('2019-04-09', 100)
,('2019-04-10', 100)
,('2019-04-11', 100)
,('2019-04-12', 100)
,('2019-04-13', 100)
,('2019-04-14', 100)
,('2019-04-15', 100)
,('2019-04-16', 100)
,('2019-04-17', 100)
,('2019-04-18', 100)
,('2019-04-19', 100)
,('2019-04-20', 100)
,('2019-04-21', 100)
,('2019-04-22', 100)
,('2019-04-23', 100)
,('2019-04-24', 100)
,('2019-04-25', 100)
,('2019-04-26', 100)
,('2019-04-27', 100)
,('2019-04-28', 100)
,('2019-04-29', 100);
DECLARE @StartDate DATETIME2 = '2019-01-01'
,@Step TINYINT = 12;
WITH DataSource ([OLDDATE], [AMOUNT], [AddMonth]) AS
(
SELECT *
,(ROW_NUMBER() OVER (ORDER BY [Date] ASC) -1 ) / 12
FROM @DataSource
)
SELECT [OLDDATE]
,[AMOUNT]
,DATEADD(DAY, ROW_NUMBER() OVER (PARTITION BY [AddMonth] ORDER BY [OLDDATE] ASC) - 1, DATEADD(MONTH, [AddMonth], @StartDate))
FROM DataSource;