2011-08-12 20 views
0

输入文件格式: 01至10 - 10位科目# 53至01 - 值为'Y'或'N'的指示器 71至10 - 时间戳 (其余字段对于此类别而言并不重要)在DFSORT中排序和拆分?

通过分割和消除重复项以两种方式对输入文件进行排序会产生不同的结果。我想知道为什么?

Casei:在同一步骤中拆分和消除重复项。

SORT FIELDS=(01,10,CH,A,53,01,CH,A) 
SUM FIELDS=NONE 
OUTFIL FILES=01,            
INCLUDE=(53,01,CH,C'Y',AND,71,10,CH,GT,&DATE2(-)),        
OUTFIL FILES=02,            
INCLUDE=(53,01,CH,C'N',AND,71,10,CH,GT,&DATE2(-)),        

Caseii:分裂和消除重复在两个不同的步骤:

STEP:01 
SORT FIELDS=(01,10,CH,A,53,01,CH,A) 
SUM FIELDS=NONE 

STEP:02 
SORT FIELDS=COPY 
OUTFIL FILES=01,            
INCLUDE=(53,01,CH,C'Y',AND,71,10,CH,GT,&DATE2(-)),        
OUTFIL FILES=02,            
INCLUDE=(53,01,CH,C'N',AND,71,10,CH,GT,&DATE2(-)),        

这两个步骤产生的不同的输出。你看到两种情况有什么区别吗?请澄清。

+0

两组排序卡的有语法错误。您在INCLUDE中缺少EQ,并且在OUTFIL上有尾随逗号。 –

+0

我同意错误,但如果我们热衷于逻辑,那么你将能够弄清楚我所指的是什么;感谢您的关注Bill :) –

+0

如果您编辑问题以纠正语法错误,我们可以删除这些注释。这就是我正在得到的,我应该更清楚 –

回答

3

你问排序上帐号(10个字符升序)然后在一个指标(1个字符升序)。 这两个字段本身决定了密钥的记录 - 时间戳不是排序关键字的一部分。因此,如果有 是两个或更多记录与相同他们可以通过排序任意(随机)的顺序。不知道 什么命令会出现时间戳值。

保持考虑到上述问题,可以考虑当你有两个记录具有相同关键但不同 时间戳值时会发生什么。其中一个时间戳值符合给定的INCLUDE标准,另一个不符合。 SUM FIELDS = NONE参数要求删除基于密钥的重复项。它通过将 所有记录与相同的密钥分组在一起,然后选择组中的最后一个来完成。由于 不包括时间戳选择的记录本质上是一个随机事件。因此,关于您是否获得满足后续INCLUDE条件的记录,是不可预知的 。

有一对夫妇的方式来解决这个问题:

  • 添加时间戳的排序键。这可能不行,因为它可能为同一帐号/离开多个记录Inidcator,那就是它可能会破坏你的重复消除请求
  • 要求一个稳定的排序。

一个稳定的排序使具有记录相同的排序关键排序后维持其相同的相对位置。 这将保留您的文件中的时间戳值的原始顺序给定相同的密钥。当删除重复项时,DFSORT将从该组重复项中选择最后一条记录。这应该为您正在寻找的重复淘汰过程带来可预测性。指定 一个稳定的排序,通过添加一个选项等于控制卡之前排序卡。

编辑点评:...挑选第一个记录

我根据我原来的答复上明确提出一组记录在最后记录与同 关键本书将是选择SUM = NONE被指定。不过,最好咨询供应商自己的手册。 IBM's DFSORT Application Programming Guide只有状态 ,每个键的记录将被选中。然而, 它也有以下注意事项:

ICETOOL的SELECT操作的第一个操作可用于执行相同 功能SUM FIELDS = NONE与OPTION平等。此外,SELECT的FIRSTDUP, ALLDUPS,NODUPS,HIGHER(x),LOWER(y),EQUAL(v),LASTDUP和LAST操作数可以是 ,用于根据与重复键和非重复键有关的其他标准来选择记录 键。 SELECT的DISCARD(savedd)操作数可用于保存最后丢弃的记录,其中FIRSTDOWN,ALLDUPS,NODUPS,HIGHER(x),LOWER(y),EQUAL(v),LASTDUP或 。 See SELECT Operator了解SELECT操作符的完整详细信息。

基于这些信息,我建议使用ICETOOL的SELECT操作符来选择正确的记录。

对不起,错误信息。

+0

这是一个很好的解释NealB。我会试着相应地更新你。一旦我检查你的决议,可能会问更多的问题。谢谢你的时间。 –

+0

它工作NealB,但一个小观察。 DFSORT从SORT FIELDS中指定的字段与SUM FIELDS = NONE组成的组中选择VERY FIRST记录,然后删除其余部分。 –

+0

为你更新了我的答案。 – NealB

0

问题在于NealB确定。

最简单的事情做的是按日期排序前“摆脱”你不想要的记录。排序将花费更少的时间。这假定不需要SORTOUT。如果是这样,你必须保持你的INCLUDE =在OUTFIL上。

SELECT是一个不错的选择。 SELECT默认使用OPTION EQUALS。下面的控制卡可以包含在xxxxCNTL数据集中,以及SELECT和USING(xxxx)中的动作。 SELECT给你比SUM更大的灵活性(你可以得到最后的,除其他外)。

整个任务听起来有缺陷。如果每个账户有不同日期的记录,我希望要么是第一个日期,要么是最后一个日期,要么是其他特定的日期,而不仅仅是在SUM结束时挂起的任何记录。

OPTION EQUALS 

INCLUDE COND=(71,10,CH,GT,&DATE2(-)) 

SORT FIELDS=(01,10,CH,A,53,01,CH,A) 

SUM FIELDS=NONE 

OUTFIL FILES=01,            
     INCLUDE=(53,01,CH,EQ,C'Y') 

OUTFIL FILES=02,            
     INCLUDE=(53,01,CH,EQ,C'N') 

或者,如果Y/N涵盖了所有记录:

OUTFIL FILES=02,SAVE