2016-12-28 10 views
0

私は以下のような要件を持っています。複合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; 
+0

言った、テーブルに1つのより多くの列を追加することは可能でしょうか?従業員がどの従業員に属しているかを参照するものがなければならない。 –

+0

あなたのテーブルに_something_があり、あなたが表示した順序で確定的に並べ替えることができれば幸いです。 – Mat

答えて

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 

Sample Demo

+0

ありがとう、その仕事と私はクエリの背後に専門性を得た –

関連する問題