トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

5-22 ソートして、前後のデータを取得

SQLパズル

テーブル
ID
--
 5
 7
 9
15
25
29
34
39
45
49
56
59
63
84
89
95
96

IDの昇順で前後となるIDも出力する。

出力結果
LagID  ID  LeadID
-----  --  ------
 null   5       7
    5   7       9
    7   9      15
    9  15      25
   15  25      29
   25  29      34
   29  34      39
   34  39      45
   39  45      49
   45  49      56
   49  56      59
   56  59      63
   59  63      84
   63  84      89
   84  89      95
   89  95      96
   95  96    null


データ作成スクリプト

create table テーブル(ID number(2));

begin
    for i in 1..100 loop
        if i in(5,7,9,15,25,29,34,39,45,49,56,59,63,84,89,95,96) then
            insert into テーブル(ID) values(i);
        end if;
    end loop;
    commit;
end;
/


SQL

--■■■サブクエリを使用する方法■■■
select
(select max(b.ID) from テーブル b where b.ID < a.ID) as LagID,
 ID,
(select min(b.ID) from テーブル b where b.ID > a.ID) as LeadID
from テーブル a
order by ID;

--■■■分析関数を使用する方法■■■
select
Lag(ID)  over (order by ID) as LagID,
ID,
Lead(ID) over (order by ID) as LeadID
from テーブル
order by ID;


解説

分析関数もしくは、
自己結合と相関サブクエリを組み合わせれば、
ソートした前後のデータを取得できます。

8-7 次の入社日を求める