0

1 つまたは複数のセグメントから作成されたパスがあるとします。すべてのパスにはidがあり、セグメントがidを使用してパスからのものかどうかを確認できます。すべてのセグメントには、始点と終点があります

問題は、セグメントが開始 - 終了 - 開始 - 終了の順序になっていないことです。

セグメント表:

id  | begin |  end  | start_with
123 |  'a'  |  'b'  | 'a'
123 |  'b'  |  'b'  | 'a'
123 |  'd'  |  'b'  | 'a'
123 |  'd'  |  'e'  | 'a'
123 |  'c'  |  'e'  | 'a'
123 |  'f'  |  'c'  | 'a'
456 |  'a'  |  'a'  | 'a'
456 |  'z'  |  'a'  | 'a'
456 |  'z'  |  'e'  | 'a'
789 |  'k'  |  'e'  | 'e'

私が実際に必要としているのは、次の表に示すように、各パスのセグメントを開始位置から終了位置まで並べ替え、シーケンス番号を付けることです。

id  | begin |  end  | sequence
123 |  'a'  |  'b'  | 1
123 |  'b'  |  'b'  | 2
123 |  'd'  |  'b'  | 3
123 |  'd'  |  'e'  | 4
123 |  'c'  |  'e'  | 5
123 |  'f'  |  'c'  | 6
456 |  'a'  |  'a'  | 1
456 |  'z'  |  'a'  | 2
456 |  'z'  |  'e'  | 3
789 |  'k'  |  'e'  | 1

これは私がやろうとしていることです:

WITH t as (SELECT id, begin, end, start_with FROM segments)
SELECT distinct t.*,level sequence FROM t
        START WITH BEGIN = start_with OR END = start_with
        CONNECT BY NOCYCLE 
        PRIOR ID = ID
        AND (PRIOR BEGIN = END
          OR PRIOR BEGIN = BEGIN 
          OR PRIOR END = BEGIN 
          OR PRIOR END = END)

私は解決策にはほど遠いと思いますが、必要なシーケンス番号だけを持っているのではなく、ここで何かが欠けています.順序。

また、約 3,000 のパスから約 4.5,000 のセグメントがあり、何百万ものレコードが得られます。

どんな助けでも大歓迎です。

4

0 に答える 0