トップページに戻る
次の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 次の入社日を求める