复杂的SQL查询以引用上一个记录



我有以下要求,需要您的帮助。

我有一个表:

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;

这里的关键是将员工分为组。从第一次出现经理到下次发生,所有员工都分为同一组。小组的所有员工都将拥有相同的经理。

这可以使用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

Sample Demo

最新更新