昔は似たようなことをしていたのに、今も同じことをしていると思うとうまくいかない。
履歴テーブルは、アカウントに発生したイベントのリストです。これらのイベントの一部はステータスの変更であり、その場合、多目的の [詳細] 列に新しいステータスが表示されます。サンプル:
... where Event_Type = 'Change_Status';
Acct Line Event_Type Detail
---- ---- ------------- -------
A 1 Change_Status Created
A 4 Change_Status Billed
A 7 Change_Status Paid
A 10 Change_Status Audited
B 1 Change_Status Created
B 6 Change_Status Billed
これをそれ自体に結合して、期間のテーブルを取得するのは簡単ですWHERE A.Acct = B.Acct および A.Line < B.Line しかし、私が失敗している2つのこと:
- 最後のステータスも攻略する必要があるのですが、その場合はエンドがありません(B.*)。左結合で取得できると思いましたが (B.Line は null)、取得しません。
A-1 から A-7 など、複数のステータスにまたがる期間を排除したい 以下の両方の項目を試しましたが、いずれか 1 つがすべてを排除しました。
AND A.LINE = (SELECT Max(Line) FROM Events TEMP WHERE TEMP.Acct = A.Acct AND TEMP.Line < B.Line or B.Line is null); AND NOT EXISTS (SELECT Line FROM Events TEMP WHERE TEMP.Acct = A.Acct AND TEMP.Line between A.Line and B.Line);
そのいずれかが不明な場合、私が作成する必要があるのは効果的です
Acct Line Acct Line Status
---- ---- ---- ---- -------
from A 1 To A 4 Created
from A 4 To A 7 Billed
from A 7 To A 10 Paid
from A 10 To Audited
from B 1 To B 6 Created