2014-12-05 3 views
0

읽기 표가 있습니다 (아래의 크게 간소화 된 버전) - 때때로 읽기 기록에 휴식이 있습니다 (N으로 표시된 레코드 참조) - 'From Read'가 있어야합니다 항상 이전의 'To Read'또는 'To Read'와 항상 일치해야합니다. 'From Read'보다 우선적으로 읽으려고합니다.DB2 SQL의 인접 레코드 만 선택하십시오.

'Y'로 플래그 된 행만 리턴하도록 DB2 SQL에서 조회를 작성하는 방법은 무엇입니까?

편집 : 연속 플래그는 내가 선택한 레코드를 나타 내기 위해 수동으로 추가 한 것이고 테이블에는 존재하지 않습니다.

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 

미리 감사드립니다. J

재귀 그런 것을 선택해야합니다
+0

귀하의 질문에 대한 답변은 '연속 ='Y '입니다. 하지만 더 많은 일이 벌어지고 있다고 생각합니다. 질문을 편집하고 설명을 명확히하고 되돌리려는 결과를 보여줘야합니다. –

+0

미안하지만, 내가 선택한 레코드를 명확하게하기 위해 연속적인 플래그를 직접 추가했습니다. 테이블에 플래그가 없습니다. – JungleJme

답변

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

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