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

5-42 Last関数

SQLパズル

Table542テーブル
KEY1  KEY2  KEY3
----  ----  ----
   1     1     1
   1     2     3
   2     1     2
   3     3     3
   3     3     4

KEY1ごとに、KEY2 desc, KEY3 descでソートした最初のレコードを出力する。

出力結果
KEY1  KEY2  KEY3
----  ----  ----
   1     2     3
   2     1     2
   3     3     4


データ作成スクリプト

create Table Table542(
KEY1 number(1),
KEY2 number(1),
KEY3 number(1));

insert into Table542 values(1,1,1);
insert into Table542 values(1,2,3);
insert into Table542 values(2,1,2);
insert into Table542 values(3,3,3);
insert into Table542 values(3,3,4);
commit;


SQL

--■■■Last関数を使う方法■■■
select KEY1,max(KEY2) as KEY2,
max(KEY3) keep(dense_rank Last order by KEY2) as KEY3
from Table542
group by KEY1
order by KEY1;

--■■■相関サブクエリを使う方法■■■
select KEY1,KEY2,KEY3
from Table542 a
where KEY2=(select max(b.KEY2) from Table542 b
             where b.KEY1=a.KEY1)
  and KEY3=(select max(c.KEY3) from Table542 c
             where c.KEY1=a.KEY1
               and c.KEY2=(select max(b.KEY2) from Table542 b
                            where b.KEY1=a.KEY1))
order by KEY1;

--■■■分析関数を使う方法■■■
select KEY1,KEY2,KEY3
from (select KEY1,KEY2,KEY3,
      Row_Number() over(partition by KEY1 order by KEY2 desc,KEY3 desc) as Rank
      from Table542)
where Rank=1
order by KEY1;


解説

Last関数を使うと、
ソート順位が最後の行の集合内での、最大値や最小値などを取得できます。