想象一下,我有由一个或多个段组成的路径。每条路径都有一个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 段,它给了我数百万条记录。
拜托,任何帮助都非常受欢迎。