2016-07-12 7 views
3

私は前の行のウィンドウで最大の日付を取得しようとしています。注目すべきは、日付の実際の時間部分です。日付の保存時間を持つMAXの解析関数

実際のテーブルにはさらに多くの日付のデータが含まれていますが、クエリはデータを1日に制限するための引数として日付をとる関数にあります。すぐに私は別の日の日付を追加すると、それが働いて「始めましょうけれどもしかし、私は...

+--------------------------------------------------+ 
¦ START_DT   ¦ END_DT   ¦ MAX_END_DT ¦ 
+------------------+------------------+------------¦ 
¦ 08/07/2016 09:00 ¦ 08/07/2016 11:00 ¦ -   ¦ 
¦ 08/07/2016 10:00 ¦ 08/07/2016 10:30 ¦ -   ¦ 
¦ 08/07/2016 10:30 ¦ 08/07/2016 12:00 ¦ -   ¦ 
¦ 08/07/2016 13:00 ¦ 08/07/2016 14:30 ¦ -   ¦ 
¦ 08/07/2016 14:00 ¦ 08/07/2016 15:00 ¦ -   ¦ 
¦ 08/07/2016 15:30 ¦ 08/07/2016 16:30 ¦ -   ¦ 
¦ 08/07/2016 16:30 ¦ 08/07/2016 17:30 ¦ -   ¦ 
+--------------------------------------------------+ 

を最大end_dtのための任意の結果が届かない

+---------------------------------------------------------------------+ 
¦FROM ¦ TO ¦ GRAPH            ¦ 
+------+-------+------------------------------------------------------¦ 
¦09:00 ¦ 11:00 ¦ [--------]           ¦ 
¦10:00 ¦ 10:30 ¦  [-]            ¦ 
¦10:45 ¦ 12:00 ¦   [-------]         ¦ 
¦13:00 ¦ 14:30 ¦      [--------]      ¦ 
¦14:00 ¦ 15:00 ¦       [-----]     ¦ 
¦15:30 ¦ 16:30 ¦          [----]   ¦ 
¦16:30 ¦ 17:30 ¦           [-----] ¦ 
+---------------------------------------------------------------------+ 
-- show the time portion when querying, for convenience 
alter session set nls_date_format = 'DD/MM/YYYY HH24:MI'; 

-- create an inline view with some data, perform select on it 
with iv_dates (start_dt, end_dt) as ( 
select to_date('08/07/2016 09:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 11:00','DD/MM/YYYY HH24:MI') from dual 
union all 
select to_date('08/07/2016 10:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 10:30','DD/MM/YYYY HH24:MI') from dual 
union all 
select to_date('08/07/2016 10:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 12:00','DD/MM/YYYY HH24:MI') from dual 
union all 
select to_date('08/07/2016 13:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 14:30','DD/MM/YYYY HH24:MI') from dual 
union all 
select to_date('08/07/2016 14:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 15:00','DD/MM/YYYY HH24:MI') from dual 
union all 
select to_date('08/07/2016 15:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 16:30','DD/MM/YYYY HH24:MI') from dual 
union all 
select to_date('08/07/2016 16:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 17:30','DD/MM/YYYY HH24:MI') from dual 
) 
SELECT start_dt 
     , end_dt 
     , MAX (end_dt) OVER (ORDER BY start_dt asc 
          RANGE BETWEEN UNBOUNDED PRECEDING 
          AND  1  PRECEDING 
         ) 
          max_end_dt 
FROM iv_dates; 

"

+--------------------------------------------------------+ 
¦ START_DT   ¦ END_DT   ¦ MAX_END_DT  ¦ 
+------------------+------------------+------------------¦ 
¦ 08/07/2016 09:00 ¦ 08/07/2016 11:00 ¦ -    ¦ 
¦ 08/07/2016 10:00 ¦ 08/07/2016 10:30 ¦ -    ¦ 
¦ 08/07/2016 10:30 ¦ 08/07/2016 12:00 ¦ -    ¦ 
¦ 08/07/2016 13:00 ¦ 08/07/2016 14:30 ¦ -    ¦ 
¦ 08/07/2016 14:00 ¦ 08/07/2016 15:00 ¦ -    ¦ 
¦ 08/07/2016 15:30 ¦ 08/07/2016 16:30 ¦ -    ¦ 
¦ 08/07/2016 16:30 ¦ 08/07/2016 17:30 ¦ -    ¦ 
¦ 09/07/2016 09:00 ¦ 09/07/2016 11:00 ¦ 08/07/2016 11:00 ¦ 
¦ 09/07/2016 10:00 ¦ 09/07/2016 10:30 ¦ 08/07/2016 11:00 ¦ 
¦ 09/07/2016 10:30 ¦ 09/07/2016 12:00 ¦ 08/07/2016 12:00 ¦ 
+--------------------------------------------------------+ 

私はパーティションを作成する必要はありませんが、私はこれをデータ用に1日使いたいと考えています。

しかし、windowing節が日付データ型のために異なる動作をしているようです。私はそれを望んでいません - 私はちょうどそれが並べ替えに従って、実際の前の行で動作するように、(date - 1)ではありません。それは日付なので、それはどうですか?私はこれをどのように扱うことができますか?

+1

私はあなたが 'RANS BETWEEN'ではなく' ROWS BETWEEN'を探していると思います。 – Noel

+0

期待される出力は?行1:「08:30 - 11:00」、行2:「09:00 - 10:30」、行3:「09:30 - 10:00」(つまり行3がネストされています行1と行2の両方)。 – MT0

+0

@ Noel Right。おっとっと。あなたは私がこれを噛んでいた時間を知りたくありません。 – Tom

答えて

1

ORDER BY start_dt asc range BETWEEN UNBOUNDED PRECEDING 1 PRECEDINGを使用している場合、Oracleは現在の行から論理オフセットを計算します。 例。 (start_dt - 1)= 08/07/2016 09:00 -1 = 07/07/2016 09:00のため、例の最初の行の範囲は08/07/2016 09:0007/07/2016 09:00 です。 。 範囲を行に変更

+0

ああ、今は愚かな気がしますか? 'RANGE'の代わりに' ROWS'を使うことは決してありませんでした。一口:-)ありがとう! – Tom

関連する問題