查找Talend中最近3个月的行值的累计总和

时间:2018-05-25 05:25:42

标签: talend

使用Talend 对数据集执行ETL,我已将“yyyyMM”列作为“MonthYear”获取,并在该月获得总计“CB”。

现在,我想找出每个月前3个月的总CB。

各自(自我加入)查询:

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中执行连接和聚合?

到目前为止我已尝试过这个...但是如何让迭代评估“test”表达式呢?

tMap组件表达式

tMap component Expression

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

请尝试这种方式,它可以帮助你

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