【问题标题】:Generate 1 row from multiple rows Talend从多行生成 1 行 Talend
【发布时间】:2020-06-29 15:01:21
【问题描述】:

我在论坛上找到了我所需要的完全相反的逻辑,所以我不得不问:)

我有这样的字段

|sector|EmployeeNr|Name|Reason|startTime|EndTime|

有了这种样本数据

|Marketing|1|Holydays|Henri|2019-10-03T07:00:00.000Z|2019-10-03T15:00:00.000Z|
|Marketing|1|Holydays|Henri|2019-10-04T07:00:00.000Z|2019-10-04T15:00:00.000Z|
|Marketing|1|Holydays|Henri|2019-10-05T07:00:00.000Z|2019-10-05T15:00:00.000Z|
|Marketing|1|Holydays|Henri|2019-10-06T07:00:00.000Z|2019-10-06T15:00:00.000Z|
|Marketing|1|sickness|Henri|2019-10-08T07:00:00.000Z|2019-10-08T15:00:00.000Z|
|Marketing|1|sickness|Henri|2019-10-09T07:00:00.000Z|2019-10-09T15:00:00.000Z|

|IT-Depart|2|Holydays|Paule|2019-11-08T07:00:00.000Z|2019-11-08T15:00:00.000Z|
|IT-Depart|2|Holydays|Paule|2019-11-09T07:00:00.000Z|2019-11-09T15:00:00.000Z|
|IT-Depart|2|Holydays|Paule|2019-11-10T07:00:00.000Z|2019-11-10T15:00:00.000Z|

|Marketing|1|Holydays|Henri|2019-10-17T07:00:00.000Z|2019-10-17T15:00:00.000Z|
|Marketing|1|Holydays|Henri|2019-10-18T07:00:00.000Z|2019-10-18T15:00:00.000Z|

我想要一个结果,同一原因连续几天缺勤的单行

类似的东西

|sector|EmployeeNr|Name|Reason|startTime|EndTime|

|Marketing|1|Holydays|Henri|2019-10-03T07:00:00.000Z|2019-10-06T15:00:00.000Z|

|Marketing|1|sickness|Henri|2019-10-08T07:00:00.000Z|2019-10-09T15:00:00.000Z|

|IT-Depart|2|Holydays|Paule|2019-11-08T07:00:00.000Z|2019-11-10T15:00:00.000Z|

|Marketing|1|Holydays|Henri|2019-10-17T07:00:00.000Z|2019-10-18T15:00:00.000Z|

我认为这应该类似于 Date、Reason 和 EmployeeNr 的聚合,但不知道如何处理。

有什么帮助吗?

【问题讨论】:

  • 您的真实数据是否像您的示例中那样排序?
  • 是的,易卜拉欣,我的数据是从数据库中排序的

标签: java talend talend-mdm


【解决方案1】:

您必须使用tAggregateRow 组件并使用以下条件,

min(startTime)
max(EndTime)
group by sector,EmployeeNr,Name,Reason

下面是截图,

【讨论】:

  • 这不考虑连续缺勤的天数
  • 嗨,吉姆,感谢您的回答。正如易卜拉欣所说,唯一的问题是它没有考虑连续的日子,所以我试图添加一个条件。例如,如果保罗从 02.06.2019 到 10.06.2019,然后从 15.09.2019 到 20.09.2019 有节假日,通过对 EmployeeNr、Reason 分组并在开始时间应用 min 函数,在结束时间应用 max 函数,结果将就像保罗从 02.06.2019 到 20.09.2019 过圣日一样。
【解决方案2】:

鉴于顺序很重要,您应该查看 tAggregateSortedRow 组件:您必须首先对键上的数据进行排序(扇区、#、原因、开始日期,然后使用您的组件)必须对键(扇区、#、原因、名称)进行分组并进行操作(最小/最大日期):当您的数据根据​​您的输入进行排序时,每次在键上检测到更改时,将执行最小和最大操作.

【讨论】:

  • 感谢您的回答,但例如,如果保罗在 02.06.2019、03.06.2019、04.06.2019、05.06.2019、06.06.2019、07.06.2019、08.06.2019、09.06 有圣日.2019 10.06.2019 然后在 15.09.2019、16.09.2019、17.09.2019、18.09.2019、19.09.2019 和 20.09.2019 通过在 EmployeeNr、Reason 上分组并对开始时间应用 min 函数并在 on结束时间,结果就像保罗从 02.06.2019 到 20.09.2019 过圣日一样。或者我想知道 Paul 从 2019 年 6 月 2 日到 2019 年 6 月 10 日有圣日。然后从 15.09.2019 到 20.09.2019。
【解决方案3】:

伙计们,我通过创建一个名为 Sequence 的新列找到了解决方案,并在遵守此条件时为该列赋予相同的值(天是连续的,并且与同一员工相关,并且出于相同的原因)。我用 Numeric.sequence 函数和 if(条件)在 tjavarow 中编写了代码

例如

 |sector|EmployeeNr|Name|Reason|startTime|EndTime|Sequence
|Marketing|1|Holydays|Henri|2019-10-03T07:00:00.000Z|2019-10-03T15:00:00.000Z|1
|Marketing|1|Holydays|Henri|2019-10-04T07:00:00.000Z|2019-10-04T15:00:00.000Z|1
|Marketing|1|Holydays|Henri|2019-10-05T07:00:00.000Z|2019-10-05T15:00:00.000Z|1
|Marketing|1|Holydays|Henri|2019-10-06T07:00:00.000Z|2019-10-06T15:00:00.000Z|1
|Marketing|1|sickness|Henri|2019-10-08T07:00:00.000Z|2019-10-08T15:00:00.000Z|2
|Marketing|1|sickness|Henri|2019-10-09T07:00:00.000Z|2019-10-09T15:00:00.000Z|2

|IT-Depart|2|Holydays|Paule|2019-11-08T07:00:00.000Z|2019-11-08T15:00:00.000Z|3
|IT-Depart|2|Holydays|Paule|2019-11-09T07:00:00.000Z|2019-11-09T15:00:00.000Z|3
|IT-Depart|2|Holydays|Paule|2019-11-10T07:00:00.000Z|2019-11-10T15:00:00.000Z|3

|Marketing|1|Holydays|Henri|2019-10-17T07:00:00.000Z|2019-10-17T15:00:00.000Z|4
|Marketing|1|Holydays|Henri|2019-10-18T07:00:00.000Z|2019-10-18T15:00:00.000Z|4

最后,按照 Jim Macaulay 的建议使用 tAggregateRow

分钟(开始时间)

最大(结束时间)

按员工编号、姓名、原因、顺序分组。

这行得通!

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多