用于引用上一条记录的复杂SQL查询

用于引用上一条记录的复杂SQL查询,sql,oracle11g,Sql,Oracle11g,我有如下要求,需要你的帮助 我有一张桌子: 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

我有如下要求,需要你的帮助

我有一张桌子:

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

这里的关键是将员工分成不同的小组。从经理的第一次出现到下一次出现,所有员工都归入同一组。一个集团的所有员工都将有同一名经理

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

是否可以在上述表格中再添加一列?最好有一些东西可以参考员工所属的经理。我希望您的表中有一些东西可以让您按照显示的顺序对其进行决定性排序,否则您就注定要失败。是否可以在所述表中再添加一列?最好有一些东西可以参考员工所属的经理。我希望您的表格中有一些东西可以让您按照显示的顺序对其进行决定性的排序,否则您就完了。非常感谢您,这很有效,我得到了查询背后的技术性问题非常感谢您,它的工作,我得到了背后的问题的技术性