很久以前做过类似的事情,但是当我认为我现在正在做同样的事情时,它不起作用。
历史表是帐户发生的事件列表。其中一些事件是状态的变化,在这种情况下,一个多用途的详细信息列会显示新的状态。样本:
... 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 但有两件事我失败了:
- 我还需要捕获最后一个状态,但在那种情况下没有结束(B.*)。我认为左连接会得到它(B.Line 为空),但事实并非如此。
需要消除跨越多个状态的时期,例如 A-1 到 A-7 尝试了以下两项,但任何一项都消除了一切。
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