在Talend中查找最近3个月行值的累积和
在使用Talend对数据集执行ETL时,我获得了yyyyMM列MonthYear和当月的总CB 现在,我想找出前3个月,每个月的总CB 各自的自连接查询:在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 >
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;