我想重复执行一个如下所示的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”。
以下是流程图:
答案 0 :(得分:4)
转型的流程:
在步骤" INPUT"我创建了一个包含三个相同字段的结果集,其日期从${date.from}
到${date.until}
(水壶变量)。 (有关此技术的详细信息,请查看我的文章 - Generating virtual tables for JOIN operations in MySQL)。
在步骤" SELECT"我设置了要使用的数据源(" INPUT")并且我想要" SELECT"要为服务结果集中的每一行执行。因为Kettle通过一个不露面的问号将参数1对1映射,所以我必须为相同的参数提供三次 - 每次使用。
"文本文件输出"最后以一般的方式输出结果。只需要设置文件名。
2013-01-01至2013-01-05的结果文本输出内容:
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
我不确定这是否是最简单的解决方案,但它可以解决问题。
答案 1 :(得分:1)
在水壶中你想避免循环,它们会在变换中造成真正的麻烦。相反,您应该通过添加一个步骤来执行此操作,该步骤将在流中为您想要的每个日期放置一行(将值存储在字段中),然后在查询中使用该字段值。
ETA:流是在步骤之间移动行(记录)的东西。可能有助于将其视为由每个跃点处的表组成,该表临时保存步骤之间的行。
您希望避免循环,因为Kettle变换仅在行级别是顺序的:行可以并行处理并且不按顺序处理,唯一的保证是该行将按顺序通过这些步骤。因此,变换中的循环不会像您直观期望的那样起作用。
仅供参考,如果您仍然不清楚流是什么,这听起来似乎您可能需要阅读一些Kettle教程。