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

10-230 旅人算の感覚(1時間間隔)

SQLパズル

day1
-------------
2008/02/01 05
2008/02/01 05
2008/02/01 05
2008/02/01 06
2008/02/01 07
2008/02/01 10
2008/02/01 11
2008/02/22 22
2008/02/22 23
2008/02/23 00
2008/02/25 22
2008/02/25 23
2008/02/26 01
2008/02/26 02
2008/02/26 03
2008/02/27 03
2008/02/27 05

変数hikiDay1以前の最新の時間を含むグループの
最大のday1と
最小のday1を出力する。

出力結果 (hikiDay1が2008年2月01日6時の時)
minDay1          maxDay1
---------------  ---------------
2008/02/01 05時  2008/02/01 07時

出力結果 (hikiDay1が2008年2月24日6時の時)
minDay1          maxDay1
---------------  ---------------
2008/02/22 22時  2008/02/23 00時

出力結果 (hikiDay1が2008年2月27日3時の時)
minDay1          maxDay1
---------------  ---------------
2008/02/27 03時  2008/02/27 03時

出力結果 (hikiDay1が2008年2月27日9時の時)
minDay1          maxDay1
---------------  ---------------
2008/02/27 05時  2008/02/27 05時

10-208 旅人算の感覚を使うクエリ(日付型バージョン)のアレンジ問題です。


データ作成スクリプト

create table TimeTable(day1) as
select to_date('2008/02/01 05','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/01 05','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/01 05','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/01 06','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/01 07','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/01 10','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/01 11','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/22 22','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/22 23','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/23 00','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/25 22','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/25 23','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/26 01','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/26 02','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/26 03','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/27 03','yyyy/mm/dd hh24') from dual union all
select to_date('2008/02/27 05','yyyy/mm/dd hh24') from dual;


SQL

col minDay1 for a20
col maxDay1 for a20

def hikiday = to_date('2008/02/01-06','yyyy/mm/dd-hh24')

select to_char(min(day1),'yyyy/mm/dd hh24"時"') as minDay1,
       to_char(max(day1),'yyyy/mm/dd hh24"時"') as maxDay1
  from (select day1,
        day1 - dense_rank() over(order by day1) /24 as groupID,
        max(case when &hikiday >= Day1 then Day1 end) over() as targetDay1
          from TimeTable)
group by groupID
having max(case when day1 = targetDay1 then 1 else 0 end) = 1;

def hikiday = to_date('2008/02/24-06','yyyy/mm/dd-hh24')
/
def hikiday = to_date('2008/02/27-03','yyyy/mm/dd-hh24')
/
def hikiday = to_date('2008/02/27-09','yyyy/mm/dd-hh24')
/


解説

旅人算の感覚(1時間間隔)を使ってます。

10-208 旅人算の感覚を使うクエリ(日付型バージョン)