연속된 값 속에서 빈 최소값 구하기 0 2 1,198

by SQL모험가 [2022.10.06 12:42:06]


DB: Oracle 18c


연속된 문자열(ID) 속에서 최대값을 구해야 해서 질문드립니다.

현재 상태가

10001, 10002, 10003, F1001, F1002, F1005, F1007, E1001, E1003, E1005, 10009, 11001, ..

이렇게 된 상태입니다.

조건에 따라 구해야 하는데

1. 문자로 시작하는 값들 중에 비어있는 값의 최소값 구하기

예) F1001, F1002, F1005, F1007 등 값이 있을때, 연속된 문자 중 F1003, F1004, F1006 이 있지만 F1003을 구해야 하고,

E1001, E1003, E1005 도 E1002, E1004가 비었지만 이 중 최소값인 E1002를 구해야 합니다.

2. 숫자로만 이루어진 값들 중 비어있는 값의 최소값 구하기

10001, 10002, 10003, F1001, F1002, F1005, F1007, E1001, E1003, E1005, 10009, 11001, .. 에서

10001, 10002, 10003, 10009, 11001, .. 만 숫자로 이루어져 있고 여기서 비어있는 값이 10004, 10005, 10006, 10007, 10008, 10010 값이 비었지만 이 중에 최소값인

10004  를 구해야 합니다.

이렇게 구하는건 어떻게 해야 하는지 가르침을 구합니다.

by 마농 [2022.10.06 13:12:40]
WITH t AS
(
SELECT '10001' id FROM dual
UNION ALL SELECT '10002' FROM dual
UNION ALL SELECT '10003' FROM dual
UNION ALL SELECT 'F1001' FROM dual
UNION ALL SELECT 'F1002' FROM dual
UNION ALL SELECT 'F1005' FROM dual
UNION ALL SELECT 'F1007' FROM dual
UNION ALL SELECT 'E1001' FROM dual
UNION ALL SELECT 'E1003' FROM dual
UNION ALL SELECT 'E1005' FROM dual
UNION ALL SELECT '10009' FROM dual
UNION ALL SELECT '11001' FROM dual
)
SELECT MIN(x) empty_min_id
  FROM (SELECT SUBSTR(id, 1, 1) gb
             , SUBSTR(id, 1, 1) || LPAD(SUBSTR(id, 2) + 1, 4, '0') x
             , LEAD(id, 1, 'x') OVER(PARTITION BY SUBSTR(id, 1, 1) ORDER BY id) y
          FROM t
        )
 WHERE x != y
 GROUP BY gb
;

 


by SQL모험가 [2022.10.06 13:53:22]

감사합니다! LEAD로 해서 다음 값을 가져와서 비교하는 거군요.

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