如何用DFSORT按年份降序排序记录组(组内不排序)
DFSORT按年份降序排序记录组问题
需求说明
- 使用DFSORT对记录组按年份降序排序
- 年份信息固定位于匹配
000010YY的记录中,紧随该字符串之后的4位数字为年份 - 仅对整个年份组进行排序,组内记录保持原有顺序不做排序
- 输入、输出文件均为FB格式,LRECL=80
输入示例
12345 5555 000010YY2021j020 12345 5555 000020AB 12345 5555 000130BC 12345 5555 000141BT01 12345 5555 000143BT05 12356 5555 000010YY2022j020 12356 5555 000020AB 12356 5555 000130BC 12356 5555 000141BT01 12367 5555 000010YY2023j020 12367 5555 000130AB 12367 5555 000020BC 12378 5555 000010YY2018j020 12378 5555 000020AB 12378 5555 000130BC 12378 5555 000141BT01 12378 5555 000143BT05 12379 5555 000010YY2017j020 12379 5555 000020AB 12379 5555 000130BC
预期输出示例
12367 5555 000010YY2023j020 12367 5555 000130AB 12367 5555 000020BC 12356 5555 000010YY2022j020 12356 5555 000020AB 12356 5555 000130BC 12356 5555 000141BT01 12345 5555 000010YY2021j020 12345 5555 000020AB 12345 5555 000130BC 12345 5555 000141BT01 12345 5555 000143BT05 12378 5555 000010YY2018j020 12378 5555 000020AB 12378 5555 000130BC 12378 5555 000141BT01 12378 5555 000143BT05 12379 5555 000010YY2017j020 12379 5555 000020AB 12379 5555 000130BC
尝试过的代码(未得到预期结果)
//SYSIN DD * INREC IFTHEN=(WHEN=GROUP,BEGIN=(12,8,CH,EQ,C'000010YY'), PUSH=(81:ID=8)) SORT FIELDS=(81,8,ZD,D,1,10,BI,A) OUTREC BUILD=(1,80) /*
问题分析与解决方案
问题原因
原代码存在两个核心问题:
- 未提取年份作为排序依据,仅靠组ID无法实现按年份降序分组
- 排序时加入了前10字节的升序排序,会打乱组内原有记录顺序
正确代码
//SYSIN DD * INREC IFTHEN=(WHEN=GROUP, BEGIN=(12,8,CH,EQ,C'000010YY'), PUSH=(81:20,4,CH)), // 提取'000010YY'后的4位年份到扩展字段 IFTHEN=(WHEN=GROUP, BEGIN=(12,8,CH,EQ,C'000010YY'), PUSH=(85:ID=4)) // 给每组分配唯一ID,保留组内原始顺序 SORT FIELDS=(81,4,CH,D,85,4,ZD,A) // 先按年份降序,再按组ID升序保证组内顺序 OUTREC BUILD=(1,80) /*
代码解释
- INREC阶段:
- 第一个
WHEN=GROUP:定位到组起始记录(匹配000010YY),将其后的4位年份(位置20-23)推到扩展位置81-84 - 第二个
WHEN=GROUP:给每个记录组分配唯一4位ID到扩展位置85-88,确保组内记录的原始顺序被锁定
- 第一个
- SORT阶段:
- 优先按81-84位置的年份字符串降序排序,实现组的年份排序需求
- 再按85-88位置的组ID升序排序,保证同一组内的记录保持原有顺序
- OUTREC阶段:去除扩展字段,输出原始的80字节记录
内容的提问来源于stack exchange,提问作者MaMu
相关产品推荐
相关产品推荐

