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 39391 게시물 읽기
No. 39391
쿼리 문의
작성자
카라(karav)
작성일
2012-04-10 10:40
조회수
3,845

칼럼A    칼럼B     칼럼C    칼럼D(결과)
a101      a01      a01       a101
a102      a01      a02       a102
null      a02      a03       a102
null      a03      a04       b205    
 
b205      a04      a05       b205     
b208      a06      a06       b208     
null      a06      a07       b208     
null      a06      a08       b208     
null      a09      a09       c304     

c304      a10      a10       c304     
c304      a10      a10       c304     
c304      a10      a10       c304     
null      a10      a10       c304     

칼럼B와 칼럼C로 정렬하여 칼럼A의 null값을 채워주는 방법있을까요?
null값은 레코드 위아래로 가장 가까운 값을 입력해주었음 합니다.
결과는 칼럼D입니다.

이 글에 대한 댓글이 총 2건 있습니다.

WITH t(a, b, c) AS
(
SELECT 'a101', 'a01', 'a01' FROM dual
UNION ALL SELECT 'a102', 'a01', 'a02' FROM dual
UNION ALL SELECT  null , 'a02', 'a03' FROM dual
UNION ALL SELECT  null , 'a03', 'a04' FROM dual
UNION ALL SELECT 'b205', 'a04', 'a05' FROM dual
UNION ALL SELECT 'b208', 'a06', 'a06' FROM dual
UNION ALL SELECT  null , 'a06', 'a07' FROM dual
UNION ALL SELECT  null , 'a06', 'a08' FROM dual
UNION ALL SELECT  null , 'a09', 'a09' FROM dual
UNION ALL SELECT 'c304', 'a10', 'a10' FROM dual
UNION ALL SELECT 'c304', 'a10', 'a10' FROM dual
UNION ALL SELECT 'c304', 'a10', 'a10' FROM dual
UNION ALL SELECT  null , 'a10', 'a10' FROM dual
)
SELECT a, b, c
     , CASE WHEN NVL(rn - r_a, 999) <= NVL(r_d - rn, 999)
            THEN d_a
            ELSE d_d
        END d
  FROM (
        SELECT a, b, c
             , rn
             , LAST_VALUE(r IGNORE NULLS) OVER(ORDER BY rn ASC ) r_a
             , LAST_VALUE(r IGNORE NULLS) OVER(ORDER BY rn DESC) r_d
             , LAST_VALUE(a IGNORE NULLS) OVER(ORDER BY rn ASC ) d_a
             , LAST_VALUE(a IGNORE NULLS) OVER(ORDER BY rn DESC) d_d
          FROM (
                SELECT a, b, c
                     , ROW_NUMBER() OVER(ORDER BY b, c) rn
                     , NVL2(a, ROW_NUMBER() OVER(ORDER BY b, c), null) r
                  FROM t
                )
        )
 ORDER BY rn
;

마농(manon94)님이 2012-04-13 00:04에 작성한 댓글입니다.

너무 도움 많이 되었습니다. 감사합니다. ^^

이렇게 간단히 풀어주시다니, 대단하십니다.

카라(karav)님이 2012-04-13 10:13에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39394선택된 항목 삭제 방법 궁금해요
축구
2012-04-12
3229
39393트리거 관련 질문있습니다. [1]
이민선
2012-04-10
3626
39392토드에서 한줄(1 row) 복사하는 법이 있나요 [1]
박우용
2012-04-10
6656
39391쿼리 문의 [2]
카라
2012-04-10
3845
39390트리거 변수처리 궁금합니다. [1]
김석훈
2012-04-10
3474
39388오라클 복구관련 문의드립니다. [3]
한희성
2012-04-08
3840
39387안녕하세요 오라클 형변환 질문좀드리겠습니다 [1]
초보
2012-04-06
3781
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다