오라클 데이터값 ㅜ도와주세요 0 6 662

by 아이린 [SQL Query] [2017.03.13 17:33:11]


현재 데이터에서 RULE_CD 첫번째 값은 항상 가져오구

그담 RULE_CD가 2값까지 가져오며 1이 있으면 안가져오고 싶은데 LAG랑 LEAD 함수를 써도 잘 해결이 안되네요

ㅜ고수님들 부탁드립니다.

RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1   2 1
1002 1 2 1 1 2
1003 1 1 2 2 3
1004 1 2 1   4
by 마농 [2017.03.13 17:44:01]

1. RULE_CD 항목이 두개나 있네요?
  - 어떤게 진짜 RULE_CD 인가요?
2. 질문이 모호하네요?
  - 가져온다 안가져온다 식의 표현보다는.
  - 원하시는 결과표 예를 보여주세요.
  - 몇가지 케이스의 예를 원본 대비 결과표로 보여주세요.


by 아이린 [2017.03.13 18:09:44]

죄송합니다 질문 내용이 부족했네요 결과값은 아래 표형식대로 데이터가 나오면 될듯합니다

예1 OP_RULE_CD 1001값이 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 1     3
1004 1 2     4
           
결과값 예1 OP_RULE_CD 1001값이 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 2     3
           
예2 OP_RULE_CD 1001값이 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 1     3
1004 1 2     4
           
           
예2 결과값 OP_RULE_CD 1001값 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
           
           
예3 OP_RULE_CD 1001값이 들어오면
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 2     3
1004 1 2     4
           
예3 OP_RULE_CD 1001값이결과값  
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 2     3
1004 1 2     4
           
           
예4 OP_RULE_CD 1003값이 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 1     3
1004 1 2     4
           
예4 OP_RULE_CD 1003 결과값      
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1003 1 2     3
1004 1 2     4

by 마농 [2017.03.13 18:20:56]

원본 대비 결과표를 보면 규칙을 알 수 있을 줄 알았는데. 모르겠네요.
설명이 필요합니다. 왜 그런지 규칙을 알려주세요. 납득할 만한 수준의 설명을...
혹시. 예시 자료가 정확한지도 확인해 주세요. 오타는 없는지?
(예1) 과 (예2) 는 조건은 동일한데 결과가 다르네요?
(예4) 는 원본과 다른 데이터가 결과로 나오네요? 데이터가 바뀌어 나오는게 맞는지?


by 아이린 [2017.03.13 18:54:19]

ㅜㅜ두분 정말 죄송합니다. 데이터 값을 잘못올렸네요 수정해서 다시 올립니다.

설명: 데이터 OP_RULE_CD값은 아무거나 들어올수 있으며 거기중에서 RULE_CD값이 1은 처음부분은 조회되며

RULE_CD값이 중간에 1이 있으면 1부터는 안가져오는걸 할려고하는 겁니다. RULE_CD는 1,2는 1번은 수동실행이냐 2번은 자동실행이냐의 여부이며 데이터는 항상 바뀔수가 있습니다.

예1 OP_RULE_CD 1001값이 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 2     3
1004 1 1     4
           
결과값 예1 OP_RULE_CD 1001값이 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 2     3
           
예2 OP_RULE_CD 1001값이 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 1     3
1004 1 2     4
           
           
예2 결과값 OP_RULE_CD 1001값 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
           
           
예3 1001값이 들어오면        
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 2     3
1004 1 2     4
           
예3 결과값          
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 2     3
1004 1 2     4
           
           
예4 OP_RULE_CD 1003값이 들어오면    
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1001 1 1     1
1002 1 2     2
1003 1 1     3
1004 1 2     4
           
예4 OP_RULE_CD 1003 결과값      
OP_RULE_CD  SW RULE_CD LAG LEAD ROWNUM
1003 1 1     3
1004 1 2     4

by jkson [2017.03.13 18:34:24]

예시 자료가 정확하지 않은 것 같습니다.

입력 받는 OP_RULE_CD 값부터 시작해서  OP_RULE_CD 값이 1씩 증가하는 데이터를 가지고오되

RULE_CD가 1인 데이터를 만나면 더이상 데이터를 가지고 오지 않게 하시려는 것 같네요.

WITH T AS
(
SELECT 1001 OP_RULE_CD, 1 SW, 1 RULE_CD FROM DUAL UNION ALL
SELECT 1002 OP_RULE_CD, 1 SW, 2 RULE_CD FROM DUAL UNION ALL
SELECT 1003 OP_RULE_CD, 1 SW, 1 RULE_CD FROM DUAL UNION ALL
SELECT 1004 OP_RULE_CD, 1 SW, 2 RULE_CD FROM DUAL
)
SELECT * 
  FROM
    (
    SELECT OP_RULE_CD, SW, RULE_CD, SUM(FG) OVER(ORDER BY OP_RULE_CD) FG
      FROM
        (
        SELECT OP_RULE_CD, SW
             , RULE_CD
             , DECODE(DECODE(OP_RULE_CD,:OP_RULE_CD,1,RULE_CD),1,1) FG 
          FROM T 
         WHERE OP_RULE_CD >= :OP_RULE_CD
        )
    )
 WHERE FG = 1
WITH T AS
(
SELECT 1001 OP_RULE_CD, 1 SW, 1 RULE_CD FROM DUAL UNION ALL
SELECT 1002 OP_RULE_CD, 1 SW, 2 RULE_CD FROM DUAL UNION ALL
SELECT 1003 OP_RULE_CD, 1 SW, 1 RULE_CD FROM DUAL UNION ALL
SELECT 1004 OP_RULE_CD, 1 SW, 2 RULE_CD FROM DUAL
)
SELECT *
  FROM (SELECT OP_RULE_CD, SW, RULE_CD, ROW_NUMBER() OVER(ORDER BY OP_RULE_CD) RN 
         FROM T)
 START WITH OP_RULE_CD = :OP_RULE_CD
CONNECT BY PRIOR RN + 1 = RN AND RULE_CD != '1'

 


by 아이린 [2017.03.13 19:20:13]

jkson님 2번째거대로 하면 될듯 합니다^^ 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입