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

5-39 インラインビューでDense_Rank関数

SQLパズル

DateTableテーブル
ID       EndDate
--  ----------------
01  2005/01/25 10:00
02  2005/01/23 12:12
03  2005/01/23 14:10
04  2005/01/23 16:00
05  2005/01/22 20:01
06  2005/01/22 22:00
07  2005/01/21 23:00

DateTableテーブルから
最新の2日分のレコード(この場合は25日と23日のレコード)を出力する。

出力結果
ID       EndDate
--  ----------------
01  2005/01/25 10:00
02  2005/01/23 12:12
03  2005/01/23 14:10
04  2005/01/23 16:00


データ作成スクリプト

create Table DateTable(
ID      char(2),
EndDate date);

insert into DateTable values('01',to_date('20050125 10:00','YYYYMMDD HH24:MI'));
insert into DateTable values('02',to_date('20050123 12:12','YYYYMMDD HH24:MI'));
insert into DateTable values('03',to_date('20050123 14:10','YYYYMMDD HH24:MI'));
insert into DateTable values('04',to_date('20050123 16:00','YYYYMMDD HH24:MI'));
insert into DateTable values('05',to_date('20050122 20:01','YYYYMMDD HH24:MI'));
insert into DateTable values('06',to_date('20050122 22:00','YYYYMMDD HH24:MI'));
insert into DateTable values('07',to_date('20050121 23:00','YYYYMMDD HH24:MI'));
commit;


SQL

--■■■Dense_Rank関数を使う方法■■■
select ID,to_char(EndDate,'YYYY/MM/DD HH24:MI') as EndDate
from (select ID,EndDate,
      Dense_Rank() over(order by trunc(EndDate) desc) as Rank from DateTable)
where Rank <= 2
order by ID;

--■■■相関サブクエリを使う方法■■■
select ID,to_char(EndDate,'YYYY/MM/DD HH24:MI') as EndDate
from DateTable a
where (select count(distinct trunc(b.EndDate)) +1 from DateTable b
        where trunc(b.EndDate) > trunc(a.EndDate)) <= 2
order by ID;


解説

trunc関数でdate型の時間情報を切り捨てて、順位付けしてます。