2013-04-08 33 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