쿼리 질문 드립니다. 0 3 762

by 픽칼 [2013.11.11 14:28:56]


안녕하세요.

다음과 같은 문제를 쿼리로 해결하려고 했는 데 잘 안 되어서 질문드립니다.

조건은 다음과 같습니다.

1. 데이터는 A, B, C가 있다

2, 가능한 한 B와 C는 연달아 올 수가 없다.

3, 기존 정렬을 최소한으로 무시해라.

예를 들어

1) 첫번째 경우
1. A 1.A
2. B 2. B
3. C   =>  4. A
4. A 3. C
5. A 5. A

2) 두번째 경우(어떠한 경우에도 연달아 오는 방법뿐이라0
1. B 1. B
2. C 2. C
3. B =>    3. B
4. C 4. C


이걸 쿼리로 작성 할려고 합니다.

가능할까요?

by 아발란체 [2013.11.11 14:37:48]
문제는 이해를 했는데,
제시되는 데이타 셋에 따라 질의가 달라 질 것 같습니다.

또한 기준이 모호한 부분이
첫 번째 경우는 C에서 분기 되고
두 번째 경우는 B에서 분기 되고
이 기준이 뭔가요?

B와 C는 연달아 올 수 없다는 단서로는 기준이 부족해 보입니다.


by 픽칼 [2013.11.11 14:42:42]

첫번째 경우는 B와 C가 연달아 오지 않기 위해서 3번과 4번의 순번을 변경한 겁니다.

5번을 가져와서 변경해도 되지만 기존 순번을 최대한 유지하기 위해서 그런 겁니다.


두번째 경우는 잘못되었네요.

결과는 1.B 3.B 2.C 4.C가 나와야 맞네요.

2.C 4.C 1.B 3.B 이런식으로 정렬되면 위에 꺼보다 기존 정렬을 너무 많이 무시해서 답이 될 수가 없습니다.

이렇게 하면 B와 C가 한번만 만나기 때문입니다.

by 우리집아찌 [2013.11.11 15:10:51]
 
--답에만 맞췄어요..
WITH T AS (
SELECT 1 SEQ , 'A' VAL FROM DUAL UNION ALL
SELECT 2 SEQ , 'B' VAL FROM DUAL UNION ALL
SELECT 3 SEQ , 'C' VAL FROM DUAL UNION ALL
SELECT 4 SEQ , 'A' VAL FROM DUAL UNION ALL
SELECT 5 SEQ , 'A' VAL FROM DUAL UNION ALL
SELECT 6 SEQ , 'B' VAL FROM DUAL UNION ALL
SELECT 7 SEQ , 'C' VAL FROM DUAL UNION ALL
SELECT 8 SEQ , 'B' VAL FROM DUAL UNION ALL
SELECT 9 SEQ , 'C' VAL FROM DUAL
)

SELECT * FROM
(SELECT T.SEQ , T.VAL
    ,CASE WHEN VAL= 'C' AND LAG(VAL) OVER(ORDER BY SEQ) = 'B' THEN SEQ + 1 ELSE SEQ END TMP_SEQ 
 FROM T )
ORDER BY 3 , VAL
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입