首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在DFSORT中进行分类和分割?

在DFSORT中进行分类和分割?
EN

Stack Overflow用户
提问于 2011-08-12 11:55:17
回答 2查看 17.8K关注 0票数 0

输入文件布局: 01至10位数字Acct# 53至01 -值'Y‘或'N’71至10时间戳的指示符(其他字段对此类型不重要)

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

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

代码语言:javascript
运行
复制
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:分两步拆分和消除重复:

代码语言:javascript
运行
复制
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(-)),                            

这两个步骤产生了不同的输出。你觉得这两种情况有什么不同吗?请澄清。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-12 15:25:03

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

请记住,当您有两个具有相同键但具有不同时间戳值的记录时,会发生什么。其中一个时间戳值满足给定的包含条件,而另一个不满足。和FIELDS=NONE参数要求根据键删除重复项。它通过使用相同的键将所有记录分组,然后选择组中的最后一个记录来实现这一点。由于key不包括时间戳,所以choosen记录本质上是一个随机事件。因此,您是否获得满足后续包括条件的记录是不可预测的。

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

  • 向排序键添加时间戳。这可能不起作用,因为它可能会为相同的帐号/ Inidcator留下多个记录,也就是说,它可能会打破重复删除的要求。
  • 要求一个稳定的类型。

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

编辑评论: ...picks,这是第一个记录

我最初的答案所依据的书清楚地说明了一组具有相同键的记录中的最后一条记录将在指定SUM=NONE时进行选择。然而,最好是查阅供应商自己的手册。IBM的DFSORT应用程序编程指南只声明将选择一个带有每个键的记录。然而,它也有以下说明:

ICETOOL的SELECT运算符的第一个操作数可以用于执行与带有选项等于的和FIELDS=NONE相同的函数。此外,select的FIRSTDUP、ALLDUPS、NODUPS、更高(X)、低(Y)、等于(V)、LASTDUP和最后操作数可用于根据与重复和非重复键相关的其他标准选择记录。SELECT的丢弃操作数(Savedd)操作数可用于保存第一个、FIRSTDUP、ALLDUPS、NODUPS、更高(X)、低(Y)、等于(V)、LASTDUP或LASTDUP丢弃的记录。有关SELECT运算符的完整详细信息,请参见见SELECT运算符

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

抱歉你说错话了。

票数 3
EN

Stack Overflow用户

发布于 2013-04-09 21:41:13

问题是,正如NealB所识别的。

最简单的方法是“删除”在排序之前你不想要的日期记录。这类的时间会更短。这假设不需要SORTOUT。如果是的话,您必须将您的INCLUDE=保存在OUTFILs上。

选择是一个很好的选择。默认情况下选择“使用”选项等于。下面的控制卡可以包含在xxxxCNTL数据集中,以及从SELECT with (Xxxx)中执行的操作。SELECT提供了比SUM更大的灵活性(除其他外,您可以得到最后一个)。

整个任务听起来有缺陷。如果每个帐户都有不同日期的记录,我希望第一次约会或最后一次约会,或者其他特定的日期,都是必需的,而不仅仅是在总数结束时碰巧出现的任何记录。

代码语言:javascript
运行
复制
 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涵盖所有记录:

代码语言:javascript
运行
复制
 OUTFIL FILES=02,SAVE                                             
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7039731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档