[퀴즈] 그룹별 (홀수/짝수)행 데이터만 검색하기 0 9 11,151

by 마농 홀수 짝수 ROW_NUMBER 홀수행 짝수행 [2010.06.14 14:31:49]


[퀴즈] 그룹별 (홀수/짝수)행 데이터만 검색하기

다음과 같은 집합에서 그룹별 이름으로 정렬하여 다음 자료를 출력하세요.
문제1. 홀수행 자료만 검색하세요.
문제2. 짝수행 자료만 검색하세요. 단, 짝수행이 없어도 그룹명은 나와야 합니다.

WITH t AS
(
SELECT 1 grp, 'A' nm FROM dual
UNION ALL SELECT 1, 'B' FROM dual
UNION ALL SELECT 1, 'C' FROM dual
UNION ALL SELECT 2, 'D' FROM dual
UNION ALL SELECT 2, 'E' FROM dual
UNION ALL SELECT 3, 'F' FROM dual
UNION ALL SELECT 4, 'G' FROM dual
UNION ALL SELECT 4, 'H' FROM dual
UNION ALL SELECT 4, 'I' FROM dual
UNION ALL SELECT 4, 'J' FROM dual
)
SELECT * FROM t;
 

 

[원본]   [홀수행]   [짝수행]
GRP NM   GRP NM   GRP NM
1 A   1 A   1 B
1 B   1 C   2 E
1 C   2 D   3  
2 D   3 F   4 H
2 E   4 G   4 J
3 F   4 I      
4 G            
4 H            
4 I            
4 J            


정답은 다시 올리겠습니다.


[정답 : 홀수] <=== 트리플클릭
SELECT grp
    , nm
FROM
(
SELECT nm, grp
    , ROW_NUMBER() OVER(PARTITION BY grp ORDER BY nm) rn
FROM t
)
WHERE MOD(rn, 2) = 1
;


[정답 : 짝수] <=== 트리플클릭
SELECT grp
    , DECODE(rn,1,'',nm) nm
FROM
(
SELECT grp, nm
    , ROW_NUMBER() OVER(PARTITION BY grp ORDER BY nm) rn
    , COUNT(*) OVER(PARTITION BY grp) cnt
FROM t
)
WHERE MOD(rn, 2) = 0
   OR cnt = 1
ORDER BY grp, nm
;


[정답 : 홀짝구분] <=== 트리플클릭
SELECT grp
    , DECODE(:gubun||rn,'01',null,nm) nm
  FROM
(
SELECT grp, nm
    , ROW_NUMBER() OVER(PARTITION BY grp ORDER BY nm) rn
    , COUNT(*) OVER(PARTITION BY grp) cnt
FROM t
)
WHERE MOD(rn, 2) = :gubun -- (구분 - 1:홀수, 0:짝수)
   OR cnt = 1
ORDER BY grp, nm
;

 

by 준 [2010.06.14 15:11:47]
SELECT B.GRP, A.NM
FROM (SELECT GRP, NM, ROW_NUMBER() OVER(PARTITION BY GRP ORDER BY NM) RN
FROM T
) A,
(SELECT DISTINCT T.GRP, :var RN
FROM T
) B
WHERE B.GRP = A.GRP(+)
AND B.RN = MOD(A.RN(+),2)
ORDER BY B.GRP, A.NM

:var가 1이면 홀수, 0이면 짝수행이 조회됩니다.

by v상이v [2010.06.14 16:16:05]
WITH t AS (
SELECT 1 grp, 'A' nm FROM dual
UNION ALL SELECT 1, 'B' FROM dual
UNION ALL SELECT 1, 'C' FROM dual
UNION ALL SELECT 2, 'D' FROM dual
UNION ALL SELECT 2, 'E' FROM dual
UNION ALL SELECT 3, 'F' FROM dual
UNION ALL SELECT 4, 'G' FROM dual
UNION ALL SELECT 4, 'H' FROM dual
UNION ALL SELECT 4, 'I' FROM dual
UNION ALL SELECT 4, 'J' FROM dual
)
SELECT GRP
,DECODE(CHK,'D','',NM) AS NM
FROM (SELECT GRP
,NM
,CASE WHEN MOD(ROW_NUMBER() OVER(PARTITION BY GRP ORDER BY GRP,NM),2) = MOD(:num, 2) THEN 'Y'
ELSE CASE WHEN COUNT(GRP) OVER(PARTITION BY GRP) = 1 THEN 'D'
ELSE 'N'
END
END CHK
FROM t
)
WHERE CHK != 'N'

:num 에 홀수나 짝수를 넣어주시면 됩니다.

by 마농 [2010.06.16 10:16:02]
두분 다 잘 풀어주셨네요.
원래 의도는 홀수, 짝수 쿼리를 따로 작성하는것이었는데요.
하나의 쿼리로 만들어 주셨네요.
정답 올렸습니다. 확인해 보세요.

by v상이v [2010.06.16 10:30:47]
늘 감사히 풀고 있습니다~

by 知音 [2010.07.20 14:51:52]
WITH t AS
(
SELECT 1 grp, 'A' nm FROM dual
UNION ALL SELECT 1, 'B' FROM dual
UNION ALL SELECT 1, 'C' FROM dual
UNION ALL SELECT 2, 'D' FROM dual
UNION ALL SELECT 2, 'E' FROM dual
UNION ALL SELECT 3, 'F' FROM dual
UNION ALL SELECT 4, 'G' FROM dual
UNION ALL SELECT 4, 'H' FROM dual
UNION ALL SELECT 4, 'I' FROM dual
UNION ALL SELECT 4, 'J' FROM dual
)
select grp, nm
from (
SELECT grp, nm, rownum rn
FROM t
)
WHERE mod(rn, 2) = :gubun

gubun = 0 : 짝수, 1 = 홀수

by 김용한 [2011.07.06 14:51:30]
<홀수열>

WITH t AS
(
SELECT 1 grp, 'A' nm FROM dual
UNION ALL SELECT 1, 'B' FROM dual
UNION ALL SELECT 1, 'C' FROM dual
UNION ALL SELECT 2, 'D' FROM dual
UNION ALL SELECT 2, 'E' FROM dual
UNION ALL SELECT 3, 'F' FROM dual
UNION ALL SELECT 4, 'G' FROM dual
UNION ALL SELECT 4, 'H' FROM dual
UNION ALL SELECT 4, 'I' FROM dual
UNION ALL SELECT 4, 'J' FROM dual
)
SELECT GRP, NM FROM T
GROUP BY GRP,NM, MOD(ROWNUM,2)
HAVING MOD(ROWNUM,2)=1
ORDER BY GRP

이렇게해도무방한가요?

by 마농 [2011.07.06 15:56:08]
물론, 예제 자료만 본다면 이미 정렬이 되어 있으니 rownum으로 해도 상관 없겠지만,
자료가 항상 원하는대로 정렬되어 있을리가 없습니다.
그냥 rownum 으로 하시면 정렬기준(그룹별 이름으로 정렬)대로 안나올 수 있습니다.
또한 rownum은 전체 조회자료에 대한 순번이므로 그룹별 순번과는 다르게 나옵니다.

by 김용한 [2011.07.06 21:59:24]
네 그렇군요... 감사합니다

by 야쿠르트세컨드 [2012.12.27 00:28:10]
SELECT g.grp, t.nm
FROM
(SELECT DISTINCT GRP FROM t) g
LEFT OUTER JOIN (
  SELECT grp, nm FROM(
    SELECT grp, nm , row_number() over(PARTITION BY grp ORDER BY nm) rn
    FROM t
    )
    WHERE mod(rn,2) = 0
) t
ON(g.grp = t.grp)
ORDER BY grp, nm
;

갯수를 세서 풀 수도 있군요. 한수 배워갑니다!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입