![](/img/trans.png)
[英]How to use previous row's column's value for calculating the next row's column's value
[英]Oracle SQL use previous column value to lookup next row
我目前拥有的:
ID FROM_REF TO_REF
--- -------- ----
1 1 10
1 2 3
1 3 4
1 3 5
1 5 6
1 6 7
1 7 9
1 8 11
1 9 8
1 10 2
我需要的是SORT列,我可以使用它来进行排序:
ID FROM_REF TO_REF SORT
--- -------- ---- ----
1 1 10 1
1 10 2 2
1 2 3 3
1 3 4 4
1 4 5 5
1 5 6 6
1 6 7 7
1 7 9 8
1 9 8 9
1 8 11 10
注意:TO_REF列表示下一个FROM_REF。
如何编写SQL以实现SORT列的结果?
请帮忙。
您可以使用RECURSIVE功能。
WITH X (ID, FROM_REF, TO_REF) AS ( SELECT ID, FROM_REF, TO_REF FROM tbl WHERE FROM_REF = 1 UNION ALL SELECT tbl.ID, tbl.FROM_REF, tbl.TO_REF FROM tbl JOIN X ON tbl.ID = X.ID AND tbl.FROM_REF = X.TO_REF ) SELECT ID, FROM_REF, TO_REF FROM X
\n ID | FROM_REF | TO_REF\n - :| -------:| -----:\n 1 | 1 | 10\n 1 | 10 | 2\n 1 | 2 | 3\n 1 | 3 | 4\n 1 | 4 | 五\n 1 | 5 | 6\n 1 | 6 | 7\n 1 | 7 | 9\n 1 | 9 | 8\n 1 | 8 | 11\n
dbfiddle 在这里
我推测,这是一个简单的分层查询。
SQL> with test (from_ref, to_ref) as
2 (select 1, 10 from dual union
3 select 2, 3 from dual union
4 select 3, 4 from dual union
5 select 4, 5 from dual union
6 select 5, 6 from dual union
7 select 6, 7 from dual union
8 select 7, 9 from dual union
9 select 8, 11 from dual union
10 select 9, 8 from dual union
11 select 10, 2 from dual
12 )
13 select from_ref, to_ref, level rn
14 from test
15 connect by from_ref = prior to_ref
16 start with from_ref = (select min(from_ref) from test);
FROM_REF TO_REF RN
---------- ---------- ----------
1 10 1
10 2 2
2 3 3
3 4 4
4 5 5
5 6 6
6 7 7
7 9 8
9 8 9
8 11 10
10 rows selected.
SQL>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.