1

昔は似たようなことをしていたのに、今も同じことをしていると思うとうまくいかない。

履歴テーブルは、アカウントに発生したイベントのリストです。これらのイベントの一部はステータスの変更であり、その場合、多目的の [詳細] 列に新しいステータスが表示されます。サンプル:

... 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つのこと:

  1. 最後のステータスも攻略する必要があるのですが、その場合はエンドがありません(B.*)。左結合で取得できると思いましたが (B.Line は null)、取得しません。
  2. 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
4

1 に答える 1

0

私はpostgres 9.1データベース(ymmv)でこれをいじりました。これは私が思いついたクエリです:

select
  x.acct, x.line, y.line, x.status
from
  statchanges x
    left join statchanges y on x.acct = y.acct
                           and y.line > x.line
where
  y.line is null or
  (y.line - x.line =
    (select min(y1.line - x1.line)
     from statchanges x1, statchanges y1
     where x1.acct = x.acct
       and x1.line = x.line
       and x1.acct = y1.acct
       and y1.line > x1.line));

重要な違い: 1- join 句では、a.line < b.line ではなく、b.line > a.line で参加しています。nullこれは、特に指定がない限り、(少なくとも postgres 9.1 では) 非 null の後にソートされるためと思われます。2-サブクエリで正しいことを確認するために、いくつかのフープをジャンプしています。非常によく似た結合を作成します( sminは気にしないので、左結合を行う必要はありません)。と が外側のクエリと一致することをnull確認してください。acctline

これがあなたが探しているものであるかどうかはわかりませんが、うまくいけば、探索するためのいくつかの方向性が得られるはずです.

于 2012-06-08T19:13:26.170 に答える