2016-07-18 4 views
1

테이블에서 짝을 이루는 왼쪽 파트의 목록을 찾는 프로젝트를 수행하고 있습니다. 이 테이블에는 고유 부품 ID 열과 왼쪽 또는 오른쪽 속성 열이 있습니다.Oracle SQL 다른 컬럼의 기준에 따라 순차 값을 찾습니다.

테이블에 오른쪽 왼쪽 쌍이 있으면 오른쪽 ID 앞에 고유 ID가 하나 표시됩니다 (ID 4는 왼쪽이고 ID 5는 오른쪽). 그러나 각 왼쪽 오른쪽 쌍 사이에 쌍이없는 많은 고유 ID가 있습니다. 테이블 내에서 모든 왼쪽 및 오른쪽 쌍을 찾기 위해 쿼리를 작성하려고합니다.

예를 들어

(현재 ID 및 LR 모두 VARCHAR2입니다)

ID LR 
1 L 
2 R 
5 R 
9 R 
22 R 
34 L 
35 R 
38 L 
91 L 
92 R 

내가 생각

ID LR 
1 L 
2 R 
34 L 
35 R 
91 L 
92 R 

내 현재 행을 반환하는 쿼리를 필요한 모든 ID를 선택하는 조건 쿼리이며, LR이 R 일 때 ID - 1이 존재하고 LR이 L이지만 확실하지는 않습니다 ... 어떤 도움이라도 대단히 감사하겠습니다! 고맙습니다.

답변

0

설정 작업은이 작업을 수행하는 한 가지 방법입니다.

-


WITH matches AS (
    SELECT to_number(ID) AS ID_integer 
    FROM base_table 
    WHERE LR = 'L' 
    INTERSECT 
    SELECT to_number(ID)-1 
    FROM base_table 
    WHERE LR = 'R' 
) 
SELECT bt.ID, bt.LR, m.ID_integer 
FROM base_table bt, matches m 
WHERE LR = 'L' 
AND to_number(bt.ID) = m.ID_integer 
UNION 
SELECT bt.ID, bt.LR, m.ID_integer 
FROM base_table bt, matches m 
WHERE LR = 'R' 
AND to_number(bt.ID)-1 = m.ID_integer 
ORDER BY 3, 2; 
+0

이 작동하지 않습니다 (의견에 따라 쿼리를 다시 작성 편집이 이제 VARCHAR ID 필드에서 앞의 0 처리) - 당신은 ID 년대는 연속적인 순서없는 것을 알 수 않았다 ? 다음 ID는 2 이후 5, 3이 아닙니다. – mathguy

+0

@mathguy, 방금 테스트 했으므로 제대로 작동합니다. –

+0

id 2를 2 대신 3으로 변경하고 (lr = R 사용) 나머지는 모두 동일하게 유지하고 쿼리가 여전히 작동하는지 확인하십시오. – mathguy

0
with inputs (id, lr) as (
     select 1, 'L' from dual union all 
     select 2, 'R' from dual union all 
     select 5, 'R' from dual union all 
     select 9, 'R' from dual union all 
     select 22, 'R' from dual union all 
     select 34, 'L' from dual union all 
     select 35, 'R' from dual union all 
     select 38, 'L' from dual union all 
     select 91, 'L' from dual union all 
     select 92, 'R' from dual 
    ), 
    prep (id, lr, prev_lr, next_lr) as (
     select id, lr, lag(lr) over (order by id), lead(lr) over (order by id) 
     from inputs 
    ) 
select id, lr 
from  prep 
where (lr = 'L' and next_lr = 'R') or (lr = 'R' and prev_lr = 'L') 
order by id 
; 


     ID L 
---------- - 
     1 L 
     2 R 
     34 L 
     35 R 
     91 L 
     92 R 
관련 문제