源中的两个日期列,用于确定informatica中的最新更新记录

时间:2016-06-20 23:19:46

标签: informatica-powercenter

我有以下要求: 我有一个像

这样的源表
id | name | address | updt_date_1 | updt_date_2
1  | abc  | xyz     | 2000-01-01  | 1999-01-01
1  | abc  | pqr     | 2001-01-01  | 1999-01-01
2  | lmn  | ghi     | 1999-01-01  | 1999-01-01
2  | lmn  | stu     | 2000-01-01  | 2008-01-01

我想进入目标:

1 | abc | pqr 
2 | lmn | stu

即。我希望记录在两个日期列中的最新更新日期-updt_date_1或updt_date_2

请建议如何在informatica PC中实施

2 个答案:

答案 0 :(得分:0)

基本上我们必须确定最大更新日期1并更新日期2。然后我们必须选择它们之间的最大值。

  1. 使用源限定符,然后根据id,name对数据进行排序。
  2. 之后添加聚合器。 pull id,name,updt_date_1,updt_date_2列。创建两个o / p列 - max_upd_dt1,max_upd_dt2并分别计算MAX(updt_date_1),MAX(updt_date_2)。按ID,名称设置组。
  3. 使用joiner根据id,name连接分拣机输出和聚合器输出。所以现在你有两个额外的列 - max_upd_dt1和max_upd_dt2。
  4. 在joiner之后使用表达式转换。拉入所有列。创建两个输出端口并设置逻辑,如下所示 - out_upd_dt1 = iif(max_upd_dt1> max_upd_dt2,max_upd_dt1,updt_date_1) out_upd_dt2 = iif(max_upd_dt1< max_upd_dt2,max_upd_dt2,updt_date_2)
  5. 使用另一个源限定符(按id,name排序)并将其与上面的表达式tx连接。加入基于 - id = id,name = name,out_upd_dt1 = updt_date_1,out_upd_dt2 = updt_date_2
  6. 提取身份证,姓名,地址
  7. HTH

    科希克

答案 1 :(得分:0)

通过仅使用3次转换(SourceQualifier,Expression和Filter),可以有效地实现此要求。请参阅以下步骤

1)在Source Qualifier转换中使用以下SQL覆盖将两个last_updated_date字段减少为一个

SELECT
    id
    ,name
    ,address
    ,CASE WHEN updt_date_1 > updt_date_2 THEN updt_date_1 ELSE updt_date_2 AS updt_date 
FROM souce_table 
ORDER BY id, updt_date DESC

现在每个id的第一行将是必需的记录。

2)使用表达式转换来标记每个id的第一行。在表达式转换中以相同的顺序使用以下端口(前缀o_表示输出端口,v_表示变量端口,i_表示输入端口)

PORT               EXPRESSION
v_FIRST_ROW_FLAG - IIF(v_PREV_ID==i_id,'N','Y')
v_PREV_ID        - i_id
o_FIRST_ROW_FLAG - v_FIRST_ROW_FLAG

3)接下来添加一个过滤器转换来过滤不满足以下条件的记录

IIF(o_FIRST_ROW_FLAG==Y,TRUE,FALSE)

将此过滤器转换连接到目标定义。这将为您提供预期的输出。