Измените ДАТУ в КОЛОННЕ, используя CASES и LOOP - PullRequest
2 голосов
/ 29 мая 2019

У меня есть данные за один месяц.

DATE       | AMOUNT
04/01/2019 | 3437824
04/02/2019 | 234834
04/03/2019 | 2343478
.
.
.
04/30/2019 | 343729

Я хочу изменить столбец даты, чтобы получить что-то вроде этого

OLDDATE    | DATE       | AMOUNT
04/01/2019 | 01/01/2019 | 3437824
04/02/2019 | 02/01/2019 | 234834
04/03/2019 | 03/01/2019 | 2343478
.
.
.
04/12/2019 | 12/01/2019 | 328456
04/13/2019 | 01/02/2019 |845754
04/14/2019 | 02/02/2019 |845754
.
.
04/24/2019 | 12/02/2019 |845754
04/25/2019 | 01/03/2019 |845754
04/26/2019 | 02/03/2019 |845754
.
.
.
04/30/2019 | 06/03/2019 | 343729

Я пытался добиться того же с помощью переключателявнутри цикла while, но не смог получить желаемый результат

BEGIN
DECLARE @Mth INT = 1;
DECLARE @Iteration INT = 1;

WHILE @Iteration != 1000000
    BEGIN
        WHILE @Mth <= 12
            BEGIN
                UPDATE TACC
                SET BUSINESSDATE = 
                CASE 
                    WHEN DAY([BUSINESSDATE])<13  
                    THEN datefromparts(year([BUSINESSDATE]), @Mth, 1)  
                    WHEN DAY([BUSINESSDATE]) BETWEEN 13 AND 24 
                    THEN datefromparts(year([BUSINESSDATE]), @Mth, 2) 
                    ELSE datefromparts(year([BUSINESSDATE]), @Mth, 3)
                END
                SET @Mth = @Mth + 1 
                IF @Mth=13 
                    BEGIN   
                        SET @Mth=1
                    END
            END
        SET @Iteration = @Iteration + 1
    END
END

Что будет лучшим способом сделать это T-SQL или DAX, если мне придется сделать это, скажем, для 10 миллионов строк

1 Ответ

0 голосов
/ 29 мая 2019

По сути, нам нужно разделить строки на группы 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;

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...