database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40149 게시물 읽기
No. 40149
그룹별 번호주기 ?
작성자
궁금해요
작성일
2013-05-29 20:29
조회수
8,626
순번 이름
그룹번호
1 A
A1
2

b


A1
3 b
A1
4 A
A2
5 b
A2
6 b
A2
7 b
A2

 


with t1 as (

select 1 순번 ,'A' 이름 from dual union all

select 2 ,'b' from dual union all

select 3 ,'b' from dual union all

select 4 ,'A' from dual union all

select 5 ,'b' from dual union all

select 6 ,'b' from dual union all

select 7 ,'b' from dual


아무리 생각해도 답이 안나와서 질문 드립니다.

'순번' 과 '이름' 값이 있을때, '그룹번호' 의 값이 저렇게 나오게 할 수 있을까요 ?

 

즉,  대문자 'A' 가 나올때마다 '그룹번호' 의 값을 A1, A2 이렇게 늘려주고 싶거든요 ~

 

단순한것 같으면서도 답이 잘 떠오르지 않네요

도움 부탁드려도 될까요 ?  ㅡ.ㅡ;

 

 

 

 






 

이 글에 대한 댓글이 총 5건 있습니다.
SELECT 순번, 이름 
     , 'A'||SUM(DECODE(이름, 'A', 1)) OVER(ORDER BY 순번) 그룹번호1
     , FIRST_VALUE(이름) OVER(ORDER BY 순번)
       ||SUM(DECODE(이름, 'A', 1)) OVER(ORDER BY 순번) 그룹번호2
  FROM t1 
아린(arin76)님이 2013-05-29 20:39에 작성한 댓글입니다.

 아린님 답변 감사드립니다

근데, 문제가 대문자 'A' 가 고정된것이 아니고,  아래처럼

''B' ,'C' ... 가 나올 수 있구요, 그때마다 새로운 그룹번호를

순번 이름
그룹번호
1 A
A1
2

b


A1
3 b
A1
4 A
A2
5 b
A2
6 B
B1
7 b
B1

 

B1 이런식으로 부여해야 해서요 ... 

일단 저도 더 시도해 봐야겠습니다 

단순한줄 알았던게 자꾸 안되니 , 머리가 아프네여 

 

union all 로 덕지덕지 않붙이고 분석함수로 

깔끔하게 끝낼 수 있을것 같은데, 딱 답이 안나오네여 

밤은 깊어가고 ~ 

궁금해요님이 2013-05-29 21:28에 작성한 댓글입니다. Edit
'A' ~ 'Z'  를 ASCII 값으로 선별했습니다.

with t1 as (
select 1 순번 ,'A' 이름 from dual union all
select 2  ,'b' from dual union all
select 3  ,'b' from dual union all
select 4  ,'A' from dual union all
select 5  ,'b' from dual union all
select 6  ,'b' from dual union all
select 7  ,'B' from dual union all
select 8  ,'b' from dual union all
select 9  ,'b' from dual union all
select 10 ,'B' from dual union all
select 11 ,'b' from dual union all
select 12 ,'C' from dual union all
select 13 ,'b' from dual
)
SELECT 순번, 이름
     , names||SUM(val) OVER(PARTITION BY names ORDER BY 순번) 그룹번호
  FROM (SELECT 순번, 이름
             , LAST_VALUE(CASE WHEN ASCII(이름) BETWEEN 65 AND 90 THEN 이름
               END IGNORE NULLS)
               OVER(ORDER BY 순번) names
             , CASE WHEN ASCII(이름) BETWEEN 65 AND 90 THEN 1 END val 
          FROM t1
        ) 
 ORDER BY 순번
아린(arin76)님이 2013-05-29 21:45에 작성한 댓글입니다.
이 댓글은 2013-05-29 21:48에 마지막으로 수정되었습니다.

굳이 아스키 안해도 될 듯

변경전 : ASCII(이름) BETWEEN 65 AND 90

변경후 : 이름 BETWEEN 'A' AND 'Z'

마농(manon94)님이 2013-05-30 08:57에 작성한 댓글입니다.

 와우 ~

LAST_VALUE 라는게 있었군요 

해결의 실마리가 보입니다 ..

아린님 정말 고맙습니다 ^^

마농님의 추가조언도 감사드려요 ~ ^.^

역시 안되는게 없군여 ~!!!

궁금해요님이 2013-05-30 09:34에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40152Function 이나 Procedure 에서 Web Service 수행 [1]
박희영
2013-06-05
7288
40151오라클 RAC ODBC 등록방법
완전초보
2013-06-05
6519
40150프로시저 작업 스케줄러 등록하기
초보자
2013-05-30
6682
40149그룹별 번호주기 ? [5]
궁금해요
2013-05-29
8626
40148Partition Table 사용시 속도 저하 문제 [1]
이철재
2013-05-29
6957
40147여러 row의 데이터를 구분자로 한줄로 뽑고 싶습니다... [4]
짱아
2013-05-29
9149
40146대형 프로젝트에서 DB 구조...
홍순우
2013-05-27
6523
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다