ORDER BY 문제 0 4 1,201

by 꿈을향해 [SQL Query] [2018.03.27 10:44:48]


안녕하세요.

컬럼의 데이터는 날짜_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로 좋은 방법이 있을까요..?

 

by 마농 [2018.03.27 11:18:12]

조인 구문은 표준이 있지만.
문자함수, 숫자함수 등은 표준이 있는지 모르겠네요?
특히나 MySQL 은 분석함수가 지원되지 않아서 어렵습니다.
날짜 따로, 순번 따로 가지 말고,
날짜별로 순번을 초기화(1번부터 시작)하면 문제 없었을 텐데요?
날짜도 8자리가 아닌 6자리네요? 이것도 문제네요? 1900 년대 자료는 없는지?
 


by 마농 [2018.03.27 11:33:24]
-- 분석함수 사용 방법 --
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 으로 변경 사용 --

 


by 꿈을향해 [2018.03.27 18:46:44]

네  다행이 1900년대 자료는 없네요.  모델링 부분은 왜그렇게 됬는지 잘 모르겠네요. ㅠ.. 

답변 감사드립니다.~!


by 마농 [2018.03.28 07:21:37]

쿼리로 해당 정렬을 구현하는 것은 비효율입니다.
모델링을 바꾸는 게 바람직해 보이네요.
일자는 8자리로 하고 순번은 일별로 초기화

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