0

想象一下,我有由一个或多个段组成的路径。每条路径都有一个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)

我相信我不是到目前为止的解决方案,但我在这里遗漏了一些东西,而不是只有我需要的序列号,我得到了多个重复的序列号,就像它为每个级别创建兄弟姐妹一样序列。

此外,我有来自大约 3k 条路径的大约 4.5k 段,它给了我数百万条记录。

拜托,任何帮助都非常受欢迎。

4

0 回答 0