2016-07-12 25 views
3

我試圖通過以前的行窗口獲取最大日期。值得注意的是日期的實際時間部分。帶日期窗口保留時間的MAX分析函數

實際的表包含大量更多日期的數據,但查詢駐留在函數中,該函數將日期作爲參數將數據限制爲一天。

+---------------------------------------------------------------------+ 
¦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; 

但是,我沒有得到任何結果的最大END_DT ...

+--------------------------------------------------+ 
¦ 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 ¦ -   ¦ 
+--------------------------------------------------+ 

雖然只要我添加日期的另一天,就可以開始「工作「

+--------------------------------------------------------+ 
¦ 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 ¦ 
+--------------------------------------------------------+ 

只是爲了說明,雖然 - 我不需要分割,我只是想這對我的工作的數據爲一天。

但似乎windowing子句由於日期數據類型而表現不同。我不希望這樣 - 我只是希望它能根據排序工作在前一行,而不是(date - 1)。是因爲這是一個約會,我該如何處理?

+1

我認爲您正在尋找'ROWS BETWEEN'而不是'RANGE BETWEEN'。 – Noel

+0

您的預期產出是多少?那麼你會發生什麼行1:'08:30 - 11:00',第2行:'09:00 - 10:30',第3行:'09:30 - 10:00'(即第3行嵌套在第1行和第2行)。 – MT0

+0

@諾爾權利。哎呀。你不想知道我咀嚼了多少時間。 – Tom

回答

1

如果您使用的是ORDER BY start_dt asc range BETWEEN UNBOUNDED PRECEDING 1 PRECEDING Oracle計算當前行的邏輯偏移量。 示例。 對於您示例中的第一行,範圍是08/07/2016 09:0007/07/2016 09:00 ,因爲(start_dt - 1)= 08/07/2016 09:00 -1 = 07/07/2016 09:00。 。 更改範圍到行

+0

哦,哇,我現在覺得愚蠢。我從來沒有想過使用'ROWS'而不是'RANGE'。嘆:-)謝謝! – Tom