0

输入文件布局:01 到 10 - 10 位数帐户# 53 到 01 - 值为“Y”或“N”的指示器 71 到 10 - 时间戳(其余字段对于此类而言无关紧要)

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

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(-)),                            

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

4

2 回答 2

3

您要求按帐号(10 个字符升序)排序,然后按指标(1 个字符升序)排序。这两个字段单独确定记录的-时间戳不是排序键的一部分。因此,如果有两个或多个具有相同的记录,它们可以按排序以任何(随机)顺序放置。不知道时间戳值将出现的顺序。

牢记上述内容,考虑当您有两条具有相同但不同 时间戳值的记录时会发生什么。这些Timestamp值之一满足给定的INCLUDE标准,而另一个不满足。SUM FIELDS=NONE参数要求根据 key 删除重复。它通过将具有相同的所有记录分组在一起,然后选择组中的最后一个记录来实现这一点。由于密钥 不包括时间戳,因此选择的记录本质上是一个随机事件。因此,您是否获得满足后续条件的记录是无法预测的包括条件。

有几种方法可以解决此问题:

  • 时间戳添加到排序键。这可能不起作用,因为它可能会为同一个帐号/指示符留下多条记录,也就是说它可能会破坏您的重复删除要求
  • 请求稳定排序。

稳定的排序导致具有相同排序的记录在排序后保持相同的相对位置。给定相同的key,这将保留文件中Timestamp值的原始顺序。删除重复项时,DFSORT 将从重复项集中选择最后一条记录。这应该为您正在寻找的重复消除过程带来可预测性。通过在SORT卡之前添加OPTIONS EQUALS控制卡来指定稳定排序。

编辑评论: ...选择了 VERY FIRST 记录

我基于原始答案的书明确指出,当指定SUM=NONE时,将选择一组具有相同键的记录中的最后一条记录。但是,最好查阅供应商自己的手册。IBM 的 DFSORT 应用程序编程指南仅声明将选择每个键的一条记录。但是,它也有以下注意事项:

ICETOOL 的 SELECT 运算符的第一个操作数可用于执行与 SUM FIELDS=NONE 和 OPTION EQUALS 相同的功能。此外,SELECT 的 FIRSTDUP、ALLDUPS、NODUPS、HIGHER(x)、LOWER(y)、EQUAL(v)、LASTDUP 和 LAST 操作数可用于根据与重复和非重复键相关的其他标准选择记录。SELECT 的 DISCARD(savedd) 操作数可用于保存被 FIRST、FIRSTDUP、ALLDUPS、NODUPS、HIGHER(x)、LOWER(y)、EQUAL(v)、LASTDUP 或 LAST 丢弃的记录。有关 SELECT 运算符的完整详细信息,请参阅 SELECT 运算符。

基于此信息,我建议使用 ICETOOL 的 SELECT 运算符来选择正确的记录。

对不起,错误信息。

于 2011-08-12T15:25:03.503 回答
0

NealB 发现了这个问题。

最简单的做法是在 SORT之前按日期“删除”您不想要的记录。SORT 将花费更少的时间。这假定不需要 SORTOUT。如果是,您必须将 INCLUDE= 保留在 OUTFIL 上。

SELECT 是一个不错的选择。SELECT 默认使用 OPTION EQUALS。下面的控制卡可以包含在 xxxxCNTL 数据集中,以及使用 USING(xxxx) 的 SELECT 操作。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                                             
于 2013-04-09T21:41:13.530 回答