在Talend中查找最近3个月行值的累积和

在Talend中查找最近3个月行值的累积和,talend,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 >

在使用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    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分量表达式


请试试这种方法,它可能会对你有帮助

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;
输出这个

在解决


这是一个嵌套的SQL查询。您能帮助Talend实现吗?这不是您在Talend中应该做的事情。您应该将此操作下推到数据库中。@Kermit谢谢,这是我在Talend上工作两周以来所猜测的。简单的ETL显然无法在此工具中执行。。。那么,Talend可以做什么级别的ETL,而其他数据科学/工程工具做不到?除了连接和推动众多的星展。你有没有提到Talend的确切用例和限制的链接?这是简单的优化,而不是工具的错误。您试图将数据库操作推送到ETL工具中,而不管该工具是什么。Talend可以做到这一点,但您需要使用tMemorizeRows来完成任务,即使如此,它也比在数据库中完成任务要慢得多。你是在评估Talend还是你的最终目标是什么?我试图弄清楚它实际上可以用于什么,并为每个组件找到用例。我发现,它最适合数据迁移。你能在这里分享一下tMemorizeRows是如何使用的吗?这是个人评价还是你有一个正在进行的项目?有一些关于使用tMemorizeRows的各种用例的博客:和。它的目的是存储前面的数据以进行计算/聚合。
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;