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

10-22 変化した回数を取得

SQLパズル

tp  cd  man
--  --  ---
 A   1    X
 A   2    X
 A   3    Y
 A   4    X
 B   1    Z
 B   2    Z
 B   3    Z
 C   1    V
 C   2    X

tpごとに、cdの昇順にmanを見て、
manが変化した回数を出力する。

出力結果
tp  ctr
--  ---
 A    3
 B    1
 C    2


データ作成スクリプト

create table table1(
tp  char(1),
cd  number(1),
man char(1));

insert into table1 values('A',1,'X');
insert into table1 values('A',2,'X');
insert into table1 values('A',3,'Y');
insert into table1 values('A',4,'X');
insert into table1 values('B',1,'Z');
insert into table1 values('B',2,'Z');
insert into table1 values('B',3,'Z');
insert into table1 values('C',1,'V');
insert into table1 values('C',2,'X');
commit;


SQL

--■■■sum関数とdecode関数を使用■■■
select tp,sum(decode(man,LagMan,0,1)) as ctr
from (select tp,man,
      Lag(man) over (partition by tp order by cd) as LagMan
      from table1)
group by tp
order by tp;

--■■■count関数とNullIf関数を使用■■■
select tp,count(NullIf(man,LagMan)) as ctr
from (select tp,man,
      Lag(man) over (partition by tp order by cd) as LagMan
      from table1)
group by tp
order by tp;


解説

Lag関数で前のmanを取得して、manが変化した回数を取得してます。