0

入力ファイルのレイアウト: 01 から 10 - 10 桁のアカウント番号 53 から 01 - 値が「Y」または「N」のインジケータ 71 から 10 - タイムスタンプ (残りのフィールドはこのソートでは重要ではありません)

入力ファイルを2つの方法で分割して重複を排除することでソートすると、結果が異なります。知りたい理由は?

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: 2 つの異なるステップでの重複の分割と削除:

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

これらの 2 つの手順により、異なる出力が得られます。両方のケースに違いはありますか?どうか明らかにしてください。

4

2 に答える 2

3

アカウント番号(10文字の昇順)で並べ替えてから、インジケーター(1文字の昇順)で並べ替えることを求めています。これらの2つのフィールドだけで、レコードのキーが決まります。タイムスタンプはソートキーの一部ではありません。したがって、同じキーを持つレコードが2つ以上ある場合は、並べ替えによって任意の(ランダムな)順序で配置できます。タイムスタンプ値が表示される順序はわかりません。

上記を念頭に置いて、同じキーでタイムスタンプ値が異なる 2つのレコードがある場合に何が起こるかを検討してください。これらのタイムスタンプ値の1つは、指定されたINCLUDE基準を満たし、もう1つは満たしていません。SUM FIELDS = NONEパラメーターは、キーに基づいて重複を削除するように要求しています。これは、同じキーを持つすべてのレコードをグループ化し、グループ内の最後のレコードを選択することによって行われます。キーにはタイムスタンプ が含まれていないため、選択されたレコードは基本的にランダムなイベントです。したがって、後続のレコードを満たすレコードを取得するかどうかについては予測できません。INCLUDE条件。

これを修正する方法はいくつかあります。

  • ソートキーにタイムスタンプを追加します。同じアカウント番号/インジケーターに複数のレコードが残る可能性があるため、これは機能しない可能性があります。つまり、重複する削除要件に違反する可能性があります。
  • 安定ソートを要求します。

安定したソートにより、同じソートキーを持つレコードは、ソート後も同じ相対位置を維持しますこれにより、同じキーが指定されたファイル内のタイムスタンプ値の元の順序が保持されます。重複の除去が発生すると、DFSORTは重複のセットから最後のレコードを選択します。これにより、探している重複除去プロセスに予測可能性がもたらされるはずです。SORTカードの前にOPTIONSEQUALS制御カードを追加して、安定ソートを指定します。

コメントの編集: ...非常に最初のレコードを選択します

私が最初の答えに基づいた本は、 SUM = NONEが指定されている場合、同じキーを持つレコードのグループの最後のレコードが選択されることを明確に述べています。ただし、常にベンダー独自のマニュアルを参照することをお勧めします。IBMのDFSORTアプリケーション・プログラミング・ガイドには、各キーを持つ1つのレコードが選択されるとのみ記載されています。ただし、次の注意事項もあります。

ICETOOLのSELECT演算子のFIRSTオペランドを使用して、OPTIONEQUALSを使用したSUMFIELDS=NONEと同じ機能を実行できます。さらに、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 が不要であることを前提としています。そうである場合は、OUTFIL で INCLUDE= を維持する必要があります。

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 に答える