테이블 값 간의 간격(?) 구하는 방법 문의 드립니다 0 3 2,222

by 초보탈출 [SQL Query] 간격 쿼리 [2014.01.27 14:05:41]



안녕하세요?

테이블 값 간의 간격(?) 구하는 방법 문의 드립니다.

예를들어 10행에 대한 특정 컬럼에
1.   A
2.   B
3 .  A 
4    C
5.   D
6.   D
7.   B
8 .  C
9.   E
10. E

라는 값이 있다고 할때

각 이격거리는
A: 1
B: 4
C: 4
D: 0
E:0 이 되고 MAX 이격거리는 4가 됩니다.

그리고 각 짝을 이루는 알파벳은 5개(A~E)이고 각 이격거리가 9 이므로 평균 이격거리는 9/5 가 됩니다.

또한
1.   X
2.   Y
3 .  Y 
4    Y
5.   X
6.   X
7.   Y
8 .  Y
9.   X
10. X

인 X,Y로만 이루어진 컬럼에서 연속된 동일값은 총 5번( 3,4 행, 6행, 8행, 10행) 나타나서  5/10가
동일 값 출현 비율이 됩니다,,


위 세개의 값(최대 이격거리, 평균이격거리, 동일값 비율)을 쿼리로 구하고자 하는데 고수님들의

도움 부탁드립니다.

감사합니다.






by 초보탈출 [2014.01.27 14:26:12]


참고로 실제 ABCDE값은 한쌍의 숫자로 되어있으며 키값이라 테이블 전체에서 두 쌍의 값은
하나만 존재합니다..
세개의 값(최대 이격거리, 평균이격거리, 동일값 비율) 쿼리는 각각 분리해도 상관없습니다.


by 마농 [2014.01.27 15:14:32]
WITH t AS
(
SELECT 1 seq, 'A' cd, 'X' xy FROM dual
UNION ALL SELECT  2, 'B', 'Y' FROM dual
UNION ALL SELECT  3, 'A', 'Y' FROM dual
UNION ALL SELECT  4, 'C', 'Y' FROM dual
UNION ALL SELECT  5, 'D', 'X' FROM dual
UNION ALL SELECT  6, 'D', 'X' FROM dual
UNION ALL SELECT  7, 'B', 'Y' FROM dual
UNION ALL SELECT  8, 'C', 'Y' FROM dual
UNION ALL SELECT  9, 'E', 'X' FROM dual
UNION ALL SELECT 10, 'E', 'X' FROM dual
)
SELECT MAX(gap) max_gap
     , AVG(gap) avg_gap
     , COUNT(flag) / COUNT(*) rat_continue
  FROM (SELECT seq, cd, xy
             , seq - LAG(seq) OVER(PARTITION BY cd ORDER BY seq) - 1 gap
             , DECODE(LAG(xy) OVER(ORDER BY seq), xy, 1) flag
          FROM t
        )
;

by 초보탈출 [2014.01.27 15:54:11]
감사합니다 마농님!

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