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

10-5 グループ化とLast関数

SQLパズル

tbl1テーブル
rec_date             data
-------------------  ----
2005/01/10 13:45:23    10
2005/01/10 18:56:08    30
2005/01/10 22:16:48    20
2005/01/11 08:32:08    80
2005/01/11 12:45:48    60
2005/01/11 16:20:14    80
2005/01/11 23:02:02    20

各日付のdataが最大のレコードを出力する。
ただし、同日のdataの最大値が複数ある場合は、時刻が最大のレコードを出力する。

出力結果
rec_date             data
-------------------  ----
2005/01/10 18:56:08    30
2005/01/11 16:20:14    80

こちらを参考にさせていただきました


データ作成スクリプト

create table tbl1(
rec_date date,
data     number(2));

insert into tbl1 values(to_date('2005/01/10 13:45:23','yyyy/mm/dd hh24/mi/ss'),10);
insert into tbl1 values(to_date('2005/01/10 13:45:23','yyyy/mm/dd hh24/mi/ss'),10);
insert into tbl1 values(to_date('2005/01/10 18:56:08','yyyy/mm/dd hh24/mi/ss'),30);
insert into tbl1 values(to_date('2005/01/10 22:16:48','yyyy/mm/dd hh24/mi/ss'),20);
insert into tbl1 values(to_date('2005/01/11 08:32:08','yyyy/mm/dd hh24/mi/ss'),80);
insert into tbl1 values(to_date('2005/01/11 12:45:48','yyyy/mm/dd hh24/mi/ss'),60);
insert into tbl1 values(to_date('2005/01/11 16:20:14','yyyy/mm/dd hh24/mi/ss'),80);
insert into tbl1 values(to_date('2005/01/11 23:02:02','yyyy/mm/dd hh24/mi/ss'),20);
commit;


SQL

select
to_char(max(rec_date) keep(dense_rank Last order by data),
        'yyyy/mm/dd hh24/mi/ss') as rec_date,
max(data) as data
from tbl1
group by trunc(rec_date)
order by rec_date;


解説

trunc関数で日付の時間情報を切り捨てて、グループ化してます。