データセットで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 件
この方法で試してみてください。
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;
これを出力
関連した質問
- talend tsendmail正規表現でファイルをフィルタリングする方法は?
- Talend tCreateTableエラー:NullPointerException
- Talendは動的な値をtSOAPメッセージに渡します
- アーキテクチャをESBとして定義できますか?
- Talend(Ubuntu):システム変数を読む
- 実行時のTalend BigDataエラー
- tHiveCreateTableコンポーネントは「orgapachehiveservicecliHiveSQLException」例外を発生させます
- Talend:tsendmailからメールを送信できません
- テキストファイルからのコンテキストロード:ロードされた変数を読み取れません
- 2つの入力ファイルからのTalendフィルター
Talend Communityで解決しました。
ジョブ
tMap式