2011-05-20 16 views
1

使用Google搜索一下,我發現這是一個有趣的問題。希望你們拍攝。檢測重疊範圍,然後在oracle中更正

有我的表

USER | MAP | STARTDAY | ENDDAY 
1  | A | 20110101 | 20110105 
1  | B | 20110106 | 20110110 
2  | A | 20110101 | 20110107 
2  | B | 20110105 | 20110110 

Whant我要的是解決用戶的2情況下,如果映射AB通過幾天重疊(從20110105至20110107)。 我希望我能夠以它從不返回重疊範圍的方式查詢該表。我的輸入數據已經很好看了,所以我不必擔心衝突處理,我只想爲這些日期的任何給定的BETWEEN獲得單個值。

的查詢可能的輸出,我試圖建立會是什麼樣

USER | MAP | STARTDAY | ENDDAY 
2  | B | 20110108 | 20110110 -- pushed overlapping days ahead.. 
2  | A | 20110101 | 20110104 -- shrunk overlapping range 

如果算法導致「無效的範圍」,例如,它甚至沒有事開始= 20110105,結束= 20110103,當我遇到這些情況時,我只會放空。

你們會說什麼?任何直接的方式來完成這個任務?

謝謝!

f。

回答

3

分析功能可以幫助:

select userid, map 
, case when prevend >= startday then prevend+1 else startday end newstart 
, endday 
from 
(select userid, map, startday, endday 
    , lag(endday) over (partition by userid order by startday) prevend 
    from mytable 
) 
order by userid, startday 

給出:

USERID MAP  NEWSTART  ENDDAY 
1  A  01/01/2011  01/05/2011 
1  B  01/06/2011  01/10/2011 
2  A  01/01/2011  01/07/2011 
2  B  01/08/2011  01/10/2011