쿼리 질문 있습니다. 0 4 1,940

by 오병운 [2009.05.07 22:41:44]


아래와 같은 조회 결과가 있습니다.

TABLE NAME :  TEST

                       NAME
  김유신
  강감찬
  이명벅
  뇌물현
  이순신
  이순신
  김구
  토마스
  토마스

 

위에 처럼 조회 결과가 나왔는데요

이름 컬럼 앞에 SEQ 시퀀스를  아래와 같이 붙일려고합니다.

SEQ NAME
1 김유신
2 강감찬
3 이명벅
4 뇌물현
5 이순신
  이순신
6 김구
7 토마스
  토마스

 

이름이 중복일시에 번호를 건너뛰게 할려고하는데요.

지금 사용하는 ORACLE버젼이 8i인데요 잘 모르겠습니다.

도움의 손길을...

by 서성우 [2009.05.08 11:15:25]
WITH test AS
(
SELECT '김유신' nam FROM dual
UNION ALL SELECT '강감찬' FROM dual
UNION ALL SELECT '이명벅' FROM dual
UNION ALL SELECT '뇌물현' FROM dual
UNION ALL SELECT '이순신' FROM dual
UNION ALL SELECT '이순신' FROM dual
UNION ALL SELECT '김구' FROM dual
UNION ALL SELECT '토마스' FROM dual
UNION ALL SELECT '토마스' FROM dual
)
SELECT Decode(rn2,1,rn,NULL) seq,
nam
FROM
(SELECT nam , rn ,
Row_Number() over(PARTITION BY nam,rn ORDER BY nam) rn2
FROM
(SELECT nam,
dense_Rank() over(ORDER BY nam) rn
FROM test)
)

by 오병운 [2009.05.08 16:57:10]
감사합니다. oracle 버젼이 8.0인데요 ~!분석 함수가 안되네요~!
서성우님 감사합니다.

by 이재현 [2009.05.08 17:49:54]
WITH T AS(
SELECT '김유신' AS A FROM DUAL UNION ALL
SELECT '김강찬' AS A FROM DUAL UNION ALL
SELECT '이명벅' AS A FROM DUAL UNION ALL
SELECT '뇌물현' AS A FROM DUAL UNION ALL
SELECT '이순신' AS A FROM DUAL UNION ALL
SELECT '이순신' AS A FROM DUAL UNION ALL
SELECT '김구' AS A FROM DUAL UNION ALL
SELECT '토마스' AS A FROM DUAL UNION ALL
SELECT '토마스' AS A FROM DUAL
)
SELECT
DECODE(LAG(A) OVER(ORDER BY NO),A,'',NO) AS RN
, A
FROM
(
SELECT
ROWNUM NO
, A
FROM T
)

by 마농 [2009.05.10 20:36:00]
-- 순위부여 규칙이 모호하네요
-- 이름컬럼만으로는 위와 같은 순서가 안나옵니다.
-- 아래쿼리는 이름순으로 정렬했습니다. 원하시는 결과물과는 순서가 다릅니다.
SELECT t1.name, COUNT(DISTINCT t2.name) + 1 rk
FROM (SELECT ROWNUM rn, name FROM test) t1, test t2
WHERE t1.name > t2.name(+)
GROUP BY t1.name, t1.rn
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입