使用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组件表达式
答案 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;
输出此