안녕하세요.
컬럼의 데이터는 날짜_SEQUNCE 형식으로 아래와 같이 들어가있습니다. SEQUNCE는 999가 넘어가면 1로 초기화됩니다.
대략 아래와 같이 들어가있습니다.
COLUMN1
..(생략)..
180126_998
180127_999
180128_001
180128_002
180128_003
180128_004
180129_005
180130_006
180130_007
..(생략)..
180320_995
180320_996
180321_997
180322_998
180322_999
180322_001
180322_002
..(생략)..
이걸 이순서 그대로 명시적으로 ORDER BY를 하려고 COLUMN1 기준으로 ASC 정렬을 하니
SELECT * FROM TABLE1 ORDER BY COLUMN1
시퀀스가 초기화 되는 부분에서
180127_999
180128_001
날짜가 바뀌면 문제가 안되는데
180322_998
180322_999
180322_001
180322_002
한날짜에서 시퀀스가 초기화 되버리면
->
180322_001
180322_002
180322_998
180322_999
이렇게 순서가 바뀌어 버리네요.
ORACLE과 MS, MY 세 기종에서 쓸수 있게 ANSI표준에 의한 SQL로 좋은 방법이 있을까요..?
-- 분석함수 사용 방법 -- SELECT c1 , SUBSTR(c1, 1, 6) dt , CONCAT( CASE WHEN MAX(SUBSTR(c1, 8, 3)) OVER(PARTITION BY SUBSTR(c1, 1, 6)) = '999' AND SUBSTR(c1, 8, 3) < '500' THEN '1' ELSE '0' END , SUBSTR(c1, 8, 3)) seq FROM t ORDER BY dt, seq ; -- 셀프 아우터 조인 이용 방법 -- SELECT a.c1 , SUBSTR(a.c1, 1, 6) dt , CONCAT( CASE WHEN b.c1 IS NOT NULL AND SUBSTR(a.c1, 8, 3) < '500' THEN '1' ELSE '0' END , SUBSTR(a.c1, 8, 3) ) seq FROM t a LEFT OUTER JOIN t b ON b.c1 = CONCAT(SUBSTR(a.c1, 1, 6), '_999') ORDER BY dt, seq ; -- MSSQL 은 SUBSTR 을 SUBSTRING 으로 변경 사용 --