2017-08-03 89 views
1

我有一個字段的表:VALID_FROM - VALID_UP - 客戶端查找日期「中斷」與SQL

比方說

2005 - 2006 - Smith 
2006 - 2009 - Smith 
2010 - 2013 - Smith 
2013 - 2014 - Smith 
2015 - 2016 - Smith 
2016 - 2017 - Smith 
2017 - today - Smith 
2014 - today - Bob 

我想找到的是中斷後的開始日期。在這種情況下:

2015 - 2016 - Smith 
2014 - today - Bob 

可能有我幾百項 - 我總是需要第一次中斷,從今天回去。

我可以在(Oracle)SQL中做到這一點嗎?

+0

爲什麼'2015 - 2016 - Smith'會成爲'FIRST中斷'?爲什麼'2010 - 2013 - 史密斯'成爲'FIRST'? –

+0

@WEI_DBA我認爲關鍵是「需要第一次中斷,***從今天開始恢復。*** – xQbert

+0

啊。如果我更仔細地閱讀,幫助一下。謝謝。:-) –

回答

3

此處的一種方法是使用LAG()分析函數爲每個客戶端檢查每行的中斷日期。然後,子查詢僅限於最新的中斷。用下面的語言來解釋下面的查詢是很困難的,但是如果你運行每一塊,從最內層的子查詢開始並向外擴展,那麼對你來說應該是有意義的。

SELECT 
    t.VALID_FROM, 
    t.VALID_UP, 
    t.CLIENT 
FROM 
(
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY CLIENT ORDER BY VALID_FROM DESC) rn 
    FROM 
    (
     SELECT t.*, 
      LAG(VALID_UP) OVER (PARTITION BY CLIENT ORDER BY VALID_FROM) v_lag 
     FROM yourTable t 
    ) t 
    WHERE t.VALID_FROM <> COALESCE(t.v_lag, -1) 
) t 
WHERE t.rn = 1; 

輸出:

enter image description here

我似乎從來沒有Rextester工作甲骨文,但我還是設法得到一個演示了SQL Server的工作:

Demo

+0

輸出應該是Smith:2015-2017 - 也許MAX()包裝器可以提供幫助? – number005

+0

@ number005 - 如果是你需要的,那麼你應該在你最初的問題中說出你的看法,在你的帖子中你說:「我想找到的是**中斷後的開始日期**。」這與顯示「今天沒有關係「作爲VALID_UP值 – mathguy

+0

@mathguy再一次,有人(不知道是誰)編輯了問題並改變了預期的輸出結果,我試圖修復它。 –