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 从全局变量初始化。转换只是同一个转换包中的几个之一。“停止交通”可能会通过不重新进入循环来隐含地实现。

这是流程图:

在此处输入图像描述

4

2 回答 2

4

转换流程:

在此处输入图像描述

在步骤“INPUT”中,我创建了一个包含三个相同字段的结果集,将日期从${date.from}直到${date.until}(Kettle 变量)。(有关此技术的详细信息,请查看我的文章 -在 MySQL 中为 JOIN 操作生成虚拟表)。

在步骤“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

我不确定这是否是最巧妙的解决方案,但它确实有效。


在此处输入图像描述

于 2013-04-11T17:14:19.257 回答
1

在 Kettle 中,您希望避免循环,它们可能会在转换中造成真正的麻烦。相反,您应该通过添加一个步骤来执行此操作,该步骤将为您想要的每个日期在流中放置一行(将值存储在字段中),然后在查询中使用该字段值。

ETA:流是在步骤之间移动行(记录)的东西。将其视为由每个跃点处的一个表组成,该表在步骤之间临时保存行可能会有所帮助。

您希望避免循环,因为 Kettle 转换仅在行级别是顺序的:行可能并行处理且无序处理,唯一的保证是行将按顺序通过步骤。因此,转换中的循环不会像您直观期望的那样起作用。

仅供参考,如果您仍然不清楚流是什么,听起来您可能需要阅读一些 Kettle 教程。

于 2013-04-08T14:45:23.973 回答