想象一下,我有一个或多个段的路径。 每个路径都有一个 ID ,您可以使用 id 检查某个段是否来自路径。每个细分都有开始点和结束点。
问题是这些段没有作为begin-end-begin-end排序:
细分表:
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段,并且它给了我数百万条记录。
拜托,欢迎任何帮助。