我有以下要求,需要你的帮助。
我有一张桌子:
name desig
A manager
B employee
C employee
D employee
E employee
F manager
G employee
我需要得到结果:
emp manager
A null
B A
C A
D A
E A
F null
G F
以下是为方便起见而开发的脚本:
create table int2 (name varchar(10), desig varchar(10));
insert into int2 values ('A','manager');
insert into int2 values ('B','employee');
insert into int2 values ('C','employee');
insert into int2 values ('D','employee');
insert into int2 values ('E','employee');
insert into int2 values ('F','manager');
insert into int2 values ('G','employee');
commit;
我尝试运行以下查询但没有帮助
with test as (
select a.* , rownum rn from int2 a
)
select a.name, a.desig
from test a, test b
where a.rn = b.rn+1
and a.desig !=b.desig;
答案 0 :(得分:3)
这里的关键是将员工分组。从第一次出现经理到下一次出现,所有员工都被分类到同一个组。一个小组的所有员工都将拥有相同的经理。
这可以使用sum
窗口功能完成。单独运行内部查询以查看如何分配组。此后,获取每个小组经理的代码非常直观。
select name,case when desig='manager' then null
else max(case when desig='manager' then name end) over(partition by grp) end as mgr
from (select i.*
,sum(case when desig='manager' then 1 else 0 end) over(order by name) as grp
from int2 i
) x