Найти накопленную сумму значений строк за последние 3 месяца в Talend - PullRequest
0 голосов
/ 25 мая 2018

Выполняя ETL для набора данных с помощью Talend , я получил столбец "yyyyMM" как "MonthYear" и общее значение "CB" в этом месяце.

Теперь я хочуузнать общее значение CB за предыдущие 3 месяца за каждый месяц.

Соответствующий запрос (самостоятельное объединение):

SELECT
    t1.MonthYear, t1.CB
    SUM(t2.CB) CB_last3months
FROM
    Table1 t1
    JOIN Table1 t2 
        ON t2.MonthYear <= t1.MonthYear
        AND t2.MonthYear >= t1.MonthYear-2
GROUP BY t1.Month

Мои данные похожи на:

MonthYear   CB
-------+-------
201601  7000
201602  5000
201603  7000
201604  6000
201605  7000
201606  4000

Я хочу, чтобы моя схема вывода была такой:

MonthYear CB    CB_last3months
------+-------+-------------------
201601  7000    7000
201602  5000    12000
201603  7000    19000
201604  6000    18000
201605  7000    20000
201606  4000    17000

В SQL я могу сделать это с помощью вложенного подзапроса или с помощью самостоятельного соединения.Как выполнить этот запрос на текущем задании Talend без необходимости сохранять строки в виде таблицы в БД (MySQL)?

Другой вариант - использование компонентов Talend для выполнения оставшихся шагов.

Но есть ли в Talend компоненты, где я могу итерационно извлекать строки и выполнять их агрегирование?Или какой-нибудь способ выполнить объединение и агрегирование в tMap?

Я пытался это сделать до сих пор ... но как мне получить итеративное вычисление "тестового" выражения?

Компонент tMapВыражение

tMap component Expression

Ответы [ 2 ]

0 голосов
/ 01 июня 2018
0 голосов
/ 25 мая 2018

Пожалуйста, попробуйте, как это может помочь вам

DECLARE @t TABLE(ColumnA INT, ColumnB VARCHAR(50));

INSERT INTO @t VALUES
(2,           'a'),
(3  ,         'b'),
(4   ,        'c'),
(5    ,       'd'),
(1     ,      'a');

;WITH cte
AS
(
   SELECT ColumnB, SUM(ColumnA) asum
   FROM @t 
   gROUP BY ColumnB

), cteRanked AS
(
   SELECT asum, ColumnB, ROW_NUMBER() OVER(ORDER BY ColumnB) rownum
   FROM cte
) 
SELECT asum AS Amount, (SELECT SUM(asum) FROM cteRanked c2 WHERE c2.rownum <= c1.rownum) AS TotalAMount, ColumnB
FROM cteRanked c1;

Выведите это

enter image description here

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