2013-04-08 45 views
1

循環我要重複執行SQL查詢看起來像這樣:在釜改造

SELECT '${date.i}' AS d, 
    COUNT(DISTINCT xid) AS n 
FROM table 
WHERE date 
    BETWEEN DATE_SUB('${date.i}', INTERVAL 6 DAY) 
    AND '${date.i}' 
; 

它基本上是一個分組的時間跨度,只是這些都相交,從而防止GROUP BY的用法。

這就是爲什麼我想要在某個時間跨度內每天重複執行查詢。但我不確定我應該如何實現循環。你會建議什麼解決方案?

Kettle變量date.i是從全局變量初始化的。轉換隻是同一個轉換包中的幾個之一。 「停止trafo」可能會隱含地通過不重新進入循環來實現。

這裏的流程圖:

enter image description here

回答

4

流程的改造:

enter image description here

在步驟「INPUT」我創建三個相同的領域保持從${date.from}的日期設置,直到${date.until}(水壺變量)的結果。 (關於這項技術的細節請查看我的文章 - Generating virtual tables for JOIN operations in MySQL)。

在步驟「SELECT」中,我設置要使用的數據源(「INPUT」),並且希望爲服務結果集中的每一行執行「SELECT」。由於水壺將參數1對1映射爲一個不露面的問號,我必須爲相同的參數服務三次 - 對於每種用法。

「文本文件輸出」最終以通用方式輸出結果。只需要設置一個文件名。生成的文本輸出2013-01-01的

內容,直到2013年1月5日:

d;n 
2013/01/01 00:00:00.000;3038 
2013/01/02 00:00:00.000;2405 
2013/01/03 00:00:00.000;2055 
2013/01/04 00:00:00.000;2796 
2013/01/05 00:00:00.000;2687 

我不知道這是否是最靈巧的解決方案,但它的伎倆。


enter image description here

1

釜內要避免環路,它們可能會導致變換真正的麻煩。相反,您應該通過添加一個步驟來實現此目的,該步驟將爲您希望的每個日期(存儲在字段中的值)在流中放入一行,然後在查詢中使用該字段值。

ETA:流是在步驟之間移動行(記錄)的東西。它可能有助於將它看作包含臨時持有行之間的行的每個躍點的表。

您希望避免循環,因爲Kettle變換隻在行級別是連續的:行可以並行處理並且不按順序處理,唯一的保證是該行將按順序通過這些步驟。由於這個原因,變換中的循環不會像你所期望的那樣起作用。

僅供參考,它也聽起來像你可能需要通過一些水壺教程,如果你仍然不清楚流是什麼。

+0

(+1)感謝反正:) – Raffael 2013-04-11 17:18:51