안녕하세요
쿼리를 작성중입니다. 도무지 감을 못잡아서.ㅠㅠ
데이타
번호 | 라인 | 값 |
1 | T1 | a |
2 | T1 | b |
3 | T1 | a |
4 | T1 | a |
5 | T1 | c |
세번째 열이 변경되는 데에 관한 프로세서입니다.
값이 a=>b 바뀌는 값이니 정상.
b=>a 돌아갈 때는 비정상(기존에 값으로 돌아갈때)
a=>a 같은 값이니까 정상.
a=>c 바뀌는 값이니 정상
라인 하나에 동적으로 값이 나오며 그값역시 정해져있지 않은 상태입니다.
예를 들면 행이 ababab 비정상 -a로 다시 되돌아가서 비정상
aaaaab 정상
aaabbc 정상
abcdef 정상
그리고 마지막으로 T1라인에서 a로 돌아가는 회수를 구해야합니다.
가능할까요? 초보는 너무 어렵습니다.
통계함수역시 그전 행만 참조하는걸 봐서.
고수님들 제발부탁드립니다.
with t as ( select '1' as seq,'T1' as line,'a' as val from dual union all select '2','T1','b' from dual union all select '3','T1','a' from dual union all select '4','T1','a' from dual union all select '5','T1','c' from dual ) select line , listagg(val) within group(order by seq) vallist , decode(nvl(sum(fg),0),0,'정상','비정상') fg1 , nvl(sum(fg),0) fg2 from ( select seq, line, val , case when val < lag(val) over (partition by line order by seq) then 1 end fg from t ) group by line
with t as ( select '1' as seq,'T1' as line,'a' as val from dual union all select '2','T1','b' from dual union all select '3','T1','a' from dual union all select '4','T1','b' from dual union all select '5','T1','c' from dual ) select seq, line, val , case when val >= nvl(max(val) over(partition by line order by seq rows between unbounded preceding and 1 preceding),'!') then '정상' else '비정상' end fg from t
'T1라인에서 a로 돌아가는 회수를 구해야합니다.' => 이건 어디에 표시되어야 하는 거죠?
그리고 실제 값이 'a', 'b' 이런 식으로 알파벳 증가 구조로 되어있는 건지도 궁금하네요.
결과값이 어떻게 나와야 된다 적어주시면 더 좋습니다.
추가)
오잉.. 생각해보니 네번째 비정상은요.. 기존에 b가 max 값이 였는데 왜 비정상이죠?
a->a->a의 경우에는 기존에 값이 나와도 정상인데요.
a 로 돌아가는 회수 관련 입장도 밝혀 주세요.
- a 로 돌아가는 것만 의미하는지? b로 돌아가는 것은?
- 혹, 비정상 횟수를 의미하는 것은 아닌지?
- 위의 행별 flag 표현과 별개의 쿼리를 원하는 건지?
- 함께 보여주길 원하는 건지? 그렇다면 표현 방법은?
SELECT seq, line, val , CASE WHEN MAX(val) OVER(PARTITION BY line ORDER BY seq ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) >= val AND LAG(val) OVER(PARTITION BY line ORDER BY seq) != val THEN '비정상' ELSE '정상' END flag FROM t ;
코드가 증가하는 구조가 아닌 것 같아
알파벳으로 증가하는 구조가 맞냐고 질문드렸었는데..;;
마농님 답변 수정해서
SELECT seq, line, val , CASE WHEN row_number() OVER(PARTITION BY line, val ORDER BY seq) != 1 AND LAG(val) OVER(PARTITION BY line ORDER BY seq) != val THEN '비정상' ELSE '정상' END flag FROM t ;
이렇게 하시면 될 것 같고
의미는 현재 val이 처음 나온 값이 아니고(row_number부분) 직전 값과 다르면(lag부분) 비정상 그게 아니면 정상