bugfix> talend > 投稿

データセットでETLを実行するTalendを使用する、「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では、ネストされたサブクエリによって、または自己結合を使用してそれを行うことができます。現在のクエリをどのように実行しますかタレントジョブ 行をテーブルとして(MySQL)DBに保存する必要はありませんか?

私の他のオプションはTalendコンポーネントを使用する 残りの手順を実行します。

しかし、Talendに行を繰り返し抽出し、それらに対して集計を実行できるコンポーネントはありますか?または、tMapで結合と集約の両方を実行する方法はありますか?

私はこれをこれまでに試みました...しかし、どのように「テスト」式を反復的に評価するのですか?

tMapコンポーネント式

回答 2 件
  • Talend Communityで解決しました。

    ジョブ

    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;
    
    

    これを出力

あなたの答え