2014-12-05 65 views
0

因此,我有一個讀數表(以下簡要簡化版) - 有時在讀取歷史記錄中有一箇中斷(請參閱我已標記爲N的記錄) - '從讀取'應該總是匹配先前的「閱讀」或「閱讀」應該總是匹配稍後的「閱讀」但是我只想選擇記錄,儘可能早於閱讀中的第一個「休息」。在DB2 SQL中只選擇連續記錄

我將如何在DB2 SQL中編寫查詢以僅返回標記爲'Y'的行?

編輯:連續標誌是我手動添加來表示我想要選擇的記錄,它不存在於桌子上。

ID From  To   Contiguous 
ABC 01/01/2014 30/06/2014 Y 
ABC 01/06/2013 01/01/2014 Y 
ABC 01/05/2013 01/06/2013 Y 
ABC 01/01/2013 01/02/2013 N 
ABC 01/10/2012 01/01/2013 N 

在此先感謝! Ĵ

+0

你的問題的答案是'where contiguous ='Y''。但是,我認爲更多的事情正在發生。您應該編輯問題,澄清說明並顯示您想要回來的結果。 – 2014-12-05 12:48:51

+0

對不起,我已經自己添加了連續標記以清楚我要選擇什麼記錄,表 – JungleJme 2014-12-05 13:03:35

回答

0

你需要一個遞歸選擇 類似的東西:

WITH RECURSIVE 
contiguous_intervals(start, end) AS (
    select start, end 
    from intervals 
    where end = (select max(end) from intervals) 
UNION ALL 
    select i.start, i.end 
    from contiguous_intervals m, intervals i 
    where i.end = m.start 
) 
select * from contiguous_intervals; 
+0

上沒有標記,這就是爲什麼我被卡住了,這種說法遠遠超出了我!這是一個包含600,000條記錄的表格,因此我需要測試這條語句,並且如果一切順利的話,它們會回來打勾。非常感謝你的快速回復 – JungleJme 2014-12-05 13:31:45

0

您可以lead()lag()做到這一點。我不確定你的情況確切的邏輯是什麼,但我認爲它是這樣的:

select r.*, 
     (case when (prev_to = from or prev_to is null) and 
        (next_from = to or next_from is null) 
      then 'Y' 
      else 'N' 
     end) as Contiguous 
from (select r.*, lead(from) over (partition by id order by from) as next_from, 
      lag(to) over (partition by id order by to) as prev_to 
     from readings r 
    ) r; 
+0

謝謝,我也會試試這個! – JungleJme 2014-12-05 13:40:46