トップページに戻る
次の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型の時間情報を切り捨てて、順位付けしてます。