我想按照描述的顺序使用两列来排序我的表:
当前余额将从下一行中的上一个余额开始。
下面是我的数据
ID_DATE PREV_BAL CURR_BAL
20200201, 157, 192
20200201, 192, 195
20200201, 123, 124
20200201, 124, 157
20200201, 125, 123
我希望按照以下顺序先订购
然后选择最上面的一行作为我的最终结果,即
ID_DATE PREV_BAL CURR_BAL
20200201, 192, 195
任何帮助
with da as (
select 20200201 id_date, 157 prev_bal, 192 curr_bal from dual
union all select 20200201 id_date, 192 prev_bal, 195 curr_bal from dual
union all select 20200201 id_date, 123 prev_bal, 124 curr_bal from dual
union all select 20200201 id_date, 124 prev_bal, 157 curr_bal from dual
union all select 20200201 id_date, 125 prev_bal, 123 curr_bal from dual
)
SELECT * FROM da
答案 0 :(得分:2)
这是一个hierarchy,您可以看到运行此查询的整个周期:
select da.*, sys_connect_by_path(curr_bal, ' - ') path
from da
connect by prior prev_bal = curr_bal
start with not exists (select 1 from da t where t.prev_bal = da.curr_bal)
ID_DATE PREV_BAL CURR_BAL PATH
-------- ---------- ---------- -------------------------------
20200201 192 195 - 195
20200201 157 192 - 195 - 192
20200201 124 157 - 195 - 192 - 157
20200201 123 124 - 195 - 192 - 157 - 124
20200201 125 123 - 195 - 192 - 157 - 124 - 123
但是,如果只想让大多数父行使用Tejash的查询或not in
或not exists
:
select * from da
where not exists (select 1 from da t where t.prev_bal = da.curr_bal)
如果您要按照问题中的说明在整个树中朝其他方向移动,请更改connect by clause
并选择叶行 :
select da.*, sys_connect_by_path(curr_bal, ' - ') path
from da
where connect_by_isleaf = 1
connect by prev_bal = prior curr_bal
start with not exists (select 1 from da t where da.prev_bal = t.curr_bal)
答案 1 :(得分:1)
我建议您进行self outer join
并在无法找到任何记录的地方进行记录CURR_BAL
包含与PREV_BAL
相同的记录。
我不知道它是否对您有帮助,但是它给出了所需的答案
类似以下内容:
with da as (
select 20200201 id_date, 157 prev_bal, 192 curr_bal from dual
union all select 20200201 id_date, 192 prev_bal, 195 curr_bal from dual
union all select 20200201 id_date, 123 prev_bal, 124 curr_bal from dual
union all select 20200201 id_date, 124 prev_bal, 157 curr_bal from dual
union all select 20200201 id_date, 125 prev_bal, 123 curr_bal from dual
)
-- Your query starts from here
SELECT
ID_DATE, PREV_BAL, CURR_BAL
FROM
(
SELECT
D.*, P.ID_DATE AS P_ID_DATE
FROM
DA D LEFT JOIN DA P ON D.CURR_BAL = P.PREV_BAL
)
WHERE P_ID_DATE IS NULL;
结果
ID_DATE PREV_BAL CURR_BAL
---------- ---------- ----------
20200201 192 195
干杯!
答案 2 :(得分:1)
这是一个简单的问题,只需使用下面的查询
SELECT * FROM (
with da as (
select 20200201 id_date, 157 prev_bal, 192 curr_bal from dual
union all select 20200201 id_date, 192 prev_bal, 195 curr_bal from dual
union all select 20200201 id_date, 123 prev_bal, 124 curr_bal from dual
union all select 20200201 id_date, 124 prev_bal, 157 curr_bal from dual
union all select 20200201 id_date, 125 prev_bal, 123 curr_bal from dual
)
SELECT * FROM da ORDER BY prev_bal DESC )
WHERE rownum=1 ORDER BY curr_bal DESC