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

10-68 グループで最大値の行のフラグオフ

SQLパズル

XXXテーブル
AAA        BBB   CCC     DDD       EEE        FFF       FLG
---------  ----  ------  --------  ---------  --------  ----
111111111  YAMA  東京都  千代田区   ○○1-1-1  20050101  null
111111111  YAMA  東京都  千代田区   ○○1-1-1  20041201  null
111111111  YAMA  東京都  千代田区   ○○1-1-1  20041115  null
222222222  KAWA  東京都  千代田区   ○○2-1-1  20050102  null
222222222  KAWA  東京都  千代田区   ○○2-1-1  20060103  null

XXXテーブルの、
AAA、BBB、CCC、DDD、EEEごとに、
FFFが最大の行のFLGを0に、
FFFが最大でない行のFLGを1に更新する

更新結果
AAA        BBB   CCC     DDD       EEE        FFF       FLG
---------  ----  ------  --------  ---------  --------  ----
111111111  YAMA  東京都  千代田区   ○○1-1-1  20050101     0
111111111  YAMA  東京都  千代田区   ○○1-1-1  20041201     1
111111111  YAMA  東京都  千代田区   ○○1-1-1  20041115     1
222222222  KAWA  東京都  千代田区   ○○2-1-1  20050102     1
222222222  KAWA  東京都  千代田区   ○○2-1-1  20060103     0


データ作成スクリプト

create table XXX(
AAA varchar2(9),
BBB varchar2(6),
CCC varchar2(10),
DDD varchar2(10),
EEE varchar2(20),
FFF varchar2(8),
FLG varchar2(1));

insert into XXX values('111111111','YAMA','東京都','千代田区','○○1-1-1','20050101',null);
insert into XXX values('111111111','YAMA','東京都','千代田区','○○1-1-1','20041201',null);
insert into XXX values('111111111','YAMA','東京都','千代田区','○○1-1-1','20041115',null);
insert into XXX values('222222222','KAWA','東京都','千代田区','○○2-1-1','20050102',null);
insert into XXX values('222222222','KAWA','東京都','千代田区','○○2-1-1','20060103',null);
commit;


SQL

--■■■max関数を使う方法■■■
update XXX a
set FLG = (select WillFLG
             from (select b.RowID as Row_ID,
                   decode(b.FFF,
                   max(b.FFF) over(partition by b.AAA,b.BBB,b.CCC,b.DDD,b.EEE),'0','1')
                   as WillFLG
                     from XXX b)
            where a.RowID = Row_ID);

--■■■in述語の引数に、複数行複数列のselect文を使う方法■■■
update XXX
set FLG = case when (aaa,bbb,ccc,ddd,eee,fff)
            in (select aaa,bbb,ccc,ddd,eee,max(fff)
                  from XXX
              group by aaa,bbb,ccc,ddd,eee) then '0' else '1' end;

--■■■Last_Value関数を使う方法■■■
update XXX
set FLG = case when RowID
                 in (select
                     Last_Value(RowID)
                     over(partition by aaa,bbb,ccc,ddd,eee
                     order by fff Rows between Unbounded Preceding and Unbounded Following)
                       from XXX) then '0' else '1' end;


解説

いずれの方法も、
非相関サブクエリを使ってます