如何在同一命令中从 2 个不同的树中 select 最高级别
How to select highest level from 2 different trees in same command
我有一个具有以下外观的数据集。
A 1
A 2
A 3
B 1
B 2
B 3
B 4
这是使用以下命令的结果
select
connect_by_root id as root,
level lvl
from
dbset
start with id in ('A','B')
connect by nocycle child = prior parent)
我要结果
A 3
B 4
也就是说,我想提取每棵树中最顶层的根。理想情况下,我希望这可以在我拥有的相同命令中完成,但我在该领域内是一个新手,不知道该怎么做。
使用排名函数row_number()
获取每个根的最高记录。
select * from
(
select *,
row_number() over (partition by id order by level desc) Seq
from table
) t
where Seq = 1
使用ROW_NUMBER
:
SELECT root, lvl
FROM
(
SELECT
connect_by_root id AS root,
level lvl,
row_number() over (PARTITION BY connect_by_root id ORDER BY level DESC) rn
FROM dbset
START WITH id IN ('A','B')
CONNECT BY NOCYCLE child = prior parent
) t
WHERE rn = 1
只需使用 group by
:
create table t23 ( dt varchar(10) ,id1 int );
insert all
into t23 values('A',1)
into t23 values('A',2)
into t23 values('A',3)
into t23 values('B',1)
into t23 values('B',2)
into t23 values('B',3)
into t23 values('B',4)
select * from dual;
select * from t23;
select dt , max(id1)id1 from t23 group by dt;
connect_by_isleaf 函数可能就是您想要的,例如:
WITH dbset AS (SELECT 'A' ID, 1 CHILD, NULL PARENT FROM dual UNION ALL
SELECT 'A' ID, 2 CHILD, 1 PARENT FROM dual UNION ALL
SELECT 'A' ID, 3 CHILD, 2 PARENT FROM dual UNION ALL
SELECT 'B' ID, 1 CHILD, NULL PARENT FROM dual UNION ALL
SELECT 'B' ID, 2 CHILD, 1 PARENT FROM dual UNION ALL
SELECT 'B' ID, 3 CHILD, 2 PARENT FROM dual UNION ALL
SELECT 'B' ID, 4 CHILD, 3 PARENT FROM dual)
SELECT connect_by_root ID AS root,
LEVEL lvl,
CONNECT_by_isleaf,
CHILD, PARENT
FROM dbset
WHERE CONNECT_by_isleaf = 1
START WITH ID IN ('A', 'B') AND PARENT IS NULL
CONNECT BY NOCYCLE PRIOR CHILD = PARENT
AND ID = PRIOR ID
ORDER BY root;
ROOT LVL CONNECT_BY_ISLEAF CHILD PARENT
---- ---------- ----------------- ---------- ----------
A 3 1 3 2
B 4 1 4 3
这与Tim Biegeleisen的回答基本相同,只是完成了测试数据,结果,sql fiddle和对分区条件的更正。
注意:一旦 Tim 的答案得到更正和完成,我很乐意删除此答案。
测试数据:
create table dbset (id varchar(1), child varchar(1), parent varchar(1) );
insert into dbset values('A','A','A');
insert into dbset values('X','A','X');
insert into dbset values('Z','X','Z');
insert into dbset values('B','6','6');
insert into dbset values('G','6','7');
insert into dbset values('H','7','8');
insert into dbset values('I','8','9');
查询:
SELECT root, lvl
FROM
(
SELECT
connect_by_root id AS root,
level lvl,
row_number() over (PARTITION BY connect_by_root id ORDER BY level DESC) rn
FROM dbset
START WITH id IN ('A','B')
CONNECT BY NOCYCLE child = prior parent
) t
WHERE rn = 1;
结果:
| ROOT | LVL |
|------|-----|
| A | 3 |
| B | 4 |
Sql fiddle: http://sqlfiddle.com/#!4/37c70/8
我有一个具有以下外观的数据集。
A 1
A 2
A 3
B 1
B 2
B 3
B 4
这是使用以下命令的结果
select
connect_by_root id as root,
level lvl
from
dbset
start with id in ('A','B')
connect by nocycle child = prior parent)
我要结果
A 3
B 4
也就是说,我想提取每棵树中最顶层的根。理想情况下,我希望这可以在我拥有的相同命令中完成,但我在该领域内是一个新手,不知道该怎么做。
使用排名函数row_number()
获取每个根的最高记录。
select * from
(
select *,
row_number() over (partition by id order by level desc) Seq
from table
) t
where Seq = 1
使用ROW_NUMBER
:
SELECT root, lvl
FROM
(
SELECT
connect_by_root id AS root,
level lvl,
row_number() over (PARTITION BY connect_by_root id ORDER BY level DESC) rn
FROM dbset
START WITH id IN ('A','B')
CONNECT BY NOCYCLE child = prior parent
) t
WHERE rn = 1
只需使用 group by
:
create table t23 ( dt varchar(10) ,id1 int );
insert all
into t23 values('A',1)
into t23 values('A',2)
into t23 values('A',3)
into t23 values('B',1)
into t23 values('B',2)
into t23 values('B',3)
into t23 values('B',4)
select * from dual;
select * from t23;
select dt , max(id1)id1 from t23 group by dt;
connect_by_isleaf 函数可能就是您想要的,例如:
WITH dbset AS (SELECT 'A' ID, 1 CHILD, NULL PARENT FROM dual UNION ALL
SELECT 'A' ID, 2 CHILD, 1 PARENT FROM dual UNION ALL
SELECT 'A' ID, 3 CHILD, 2 PARENT FROM dual UNION ALL
SELECT 'B' ID, 1 CHILD, NULL PARENT FROM dual UNION ALL
SELECT 'B' ID, 2 CHILD, 1 PARENT FROM dual UNION ALL
SELECT 'B' ID, 3 CHILD, 2 PARENT FROM dual UNION ALL
SELECT 'B' ID, 4 CHILD, 3 PARENT FROM dual)
SELECT connect_by_root ID AS root,
LEVEL lvl,
CONNECT_by_isleaf,
CHILD, PARENT
FROM dbset
WHERE CONNECT_by_isleaf = 1
START WITH ID IN ('A', 'B') AND PARENT IS NULL
CONNECT BY NOCYCLE PRIOR CHILD = PARENT
AND ID = PRIOR ID
ORDER BY root;
ROOT LVL CONNECT_BY_ISLEAF CHILD PARENT
---- ---------- ----------------- ---------- ----------
A 3 1 3 2
B 4 1 4 3
这与Tim Biegeleisen的回答基本相同,只是完成了测试数据,结果,sql fiddle和对分区条件的更正。
注意:一旦 Tim 的答案得到更正和完成,我很乐意删除此答案。
测试数据:
create table dbset (id varchar(1), child varchar(1), parent varchar(1) );
insert into dbset values('A','A','A');
insert into dbset values('X','A','X');
insert into dbset values('Z','X','Z');
insert into dbset values('B','6','6');
insert into dbset values('G','6','7');
insert into dbset values('H','7','8');
insert into dbset values('I','8','9');
查询:
SELECT root, lvl
FROM
(
SELECT
connect_by_root id AS root,
level lvl,
row_number() over (PARTITION BY connect_by_root id ORDER BY level DESC) rn
FROM dbset
START WITH id IN ('A','B')
CONNECT BY NOCYCLE child = prior parent
) t
WHERE rn = 1;
结果:
| ROOT | LVL |
|------|-----|
| A | 3 |
| B | 4 |
Sql fiddle: http://sqlfiddle.com/#!4/37c70/8