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 のセグメントがあり、何百万ものレコードが得られます。
どんな助けでも大歓迎です。