如何在Informatica中提取首条记录col4值并与其余记录对比
没问题,我来给你一个纯Informatica的解决方案,完全不用Shell脚本就能搞定你的需求:
首先明确你的需求和示例数据:
需求:提取第一条记录的col4字段值,与其余所有记录的col4字段值进行对比,将对比结果(匹配/不匹配)存入新增的col5字段。要求仅使用Informatica实现,不使用Shell脚本。
示例输入数据:
col1|col2|col3|col4 aa|123|456|50 bb|101|222|50 cc|102|232|70 dd|103|142|70 ee|104|472|50
期望输出数据:
col1|col2|col3|col4|col5 aa|123|456|50|Matching bb|101|222|50|Matching cc|102|232|70|Not matching dd|103|142|70|Not matching ee|104|472|50|Matching
方案一:通用稳定实现(不依赖数据顺序)
这个方案适用于所有数据源,不管数据读取顺序如何,都能准确抓取第一条记录的col4值:
1. 添加Sequence Generator转换
- 给每条记录生成一个自增的序列ID(命名为
seq_id),起始值设为1,增量为1。这样第一条被处理的记录seq_id就是1,后续记录依次递增。
2. 添加Aggregator转换获取第一条记录的col4值
- 将Sequence Generator的输出连接到Aggregator转换。
- 在Aggregator中创建输出端口
first_col4,使用表达式:
(用MAX(DECODE(seq_id, 1, col4))MIN也可以,因为只有seq_id=1的记录会返回col4值,其余都是NULL,聚合后结果一致) - 关键:不要设置任何Group By条件,这样Aggregator会把所有数据聚合为一组,直接得到第一条记录的col4值。
3. 添加Joiner转换关联所有记录与first_col4
- 把带
seq_id的原始数据流作为主输入,Aggregator的输出(仅一行,包含first_col4)作为细节输入。 - 设置连接条件为
1=1(恒真条件),这样每条原始记录都会和first_col4的值关联上。
4. 添加Expression转换生成col5字段
- 在Expression转换中创建输出端口
col5,用以下表达式判断匹配结果:IIF(col4 = first_col4, 'Matching', 'Not matching')
5. 整理输出
- 在Target组件中选择需要输出的字段:
col1、col2、col3、col4、col5,去掉不需要的seq_id和first_col4即可。
方案二:简化实现(依赖数据顺序)
如果你的数据源可以保证读取顺序(比如文件的第一条就是目标记录,或者数据库Source Qualifier中添加了固定排序条件),可以用Session变量简化步骤:
1. 添加Expression转换
- 创建一个Session级变量
$$FIRST_COL4,初始值设为空。 - 创建输出端口
col5,使用以下表达式:IIF(ISNULL($$FIRST_COL4), (SETVARIABLE($$FIRST_COL4, col4), 'Matching'), IIF(col4 = $$FIRST_COL4, 'Matching', 'Not matching') ) - 原理:第一条记录进来时,
$$FIRST_COL4为空,先把当前col4的值存入变量,同时返回Matching;后续记录直接和变量中的值对比,返回对应结果。
2. 输出到目标
- 直接将Expression转换的输出连接到Target,选择需要的字段即可。
内容的提问来源于stack exchange,提问作者Balaji
相关产品推荐
相关产品推荐

