【问题标题】:Find cumulative sum of last 3 months' row values in Talend在 Talend 中查找最近 3 个月的行值的累积总和
【发布时间】:2018-05-25 05:25:41
【问题描述】:

使用 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 中执行连接和聚合的某种方式?

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

tMap 组件表达式

【问题讨论】:

  • 这不是您在 Talend 中应该做的事情。您应该将此操作下推到数据库。
  • @Kermit 谢谢,这是我在 Talend 工作两周以来的推测。简单的 ETL 显然无法在此工具中执行……那么 Talend 究竟可以做到什么级别的 ETL,而其他数据科学/工程工具却无法做到呢?除了连接和推送到众多数据库。您是否有提及 Talend 的确切用例和限制的链接?
  • 这是简单的优化,不是工具的错。您正在尝试将数据库操作推送到 ETL 工具中(无论工具是什么)。 Talend 可以做到这一点,但您需要使用tMemorizeRows 来完成您的任务,即便如此,它也会比在数据库中执行它要慢得多(应该如何)。您是在评估 Talend 还是您的最终目标是什么?
  • 我试图弄清楚它可以实际用于什么,并为每个组件找到用例。大多数情况下,我发现它最适合数据迁移。你能分享一下tMemorizeRows在这里如何使用吗?
  • 这是个人评价还是您有正在从事的项目?有一些关于使用 tMemorizeRows 的各种用例的博客:Calculating an expiration dateAggregated child data。它的目的是存储之前的数据以进行计算/聚合。

标签: talend


【解决方案1】:

请试试这个方法可能对你有帮助

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 实施吗?
猜你喜欢
  • 1970-01-01
  • 2022-12-31
  • 2020-04-08
  • 1970-01-01
  • 2012-11-30
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
相关资源
最近更新 更多