연속된 데이터 값 채우기 0 4 3,896

by 손님 [SQL Query] [2009.11.25 18:13:05]


 

안녕하세요.

------------------------------------------------------------------

1                                         1               55          24

2                                        ----------열없음--------------

3                                         3                44          14

4                                       ----------열없음--------------

5                                       ----------열없음--------------

6                                         6                52           22

=======                            ================

A테이블                                B테이블

 

위와 같이 두개의 테이블이 있습니다.

물론 아우터 조인을 활용해 A테이블의 키와 B테이블의 앞에 키를 연결해서 집합을 만들었는데요.

 

1         1               55          24

2         n               n              n

3         3                44          14

4         n                  n           n

5         n                  n           n

6         6                52           22

 

이 집합에서 n(null)로 있는 부분을 위에 값으로 가져오고 싶습니다. 즉,

1         1               55          24

2         1              55          24

3         3                44          14

4         3                44          14

5         3                44          14

6         6                52           22

요런 결과 집합을 만들고 싶습니다.

1         1               55          24       1

2         n               n              n        1

3         3                44          14      2

4         n                  n           n        2

5         n                  n           n        2

6         6                52           22      3

요런 식으로 우측에 넘버를 매겨

 row_number(), max()를 활용해서 구했었는데,

헤매다 도움을 요청 합니다. ㅠㅠ

감사합니다.

by 마농 [2009.11.26 09:18:33]
WITH a AS
(
SELECT LEVEL no FROM dual CONNECT BY LEVEL <= 6
)
, b AS
(
SELECT 1 no, 55 v1, 24 v2 FROM dual
UNION ALL SELECT 3, 44, 14 FROM dual
UNION ALL SELECT 6, 52, 22 FROM dual
)
SELECT *
FROM b
MODEL DIMENSION BY (no)
MEASURES (no no1, v1, v2)
RULES
( no1[FOR no IN (SELECT no FROM a)] = NVL(no1[CV()],no1[CV()-1])
, v1[FOR no IN (SELECT no FROM a)] = NVL(v1[CV()],v1[CV()-1])
, v2[FOR no IN (SELECT no FROM a)] = NVL(v2[CV()],v2[CV()-1])
)
ORDER BY no
;

by 반테러 [2009.11.26 11:18:59]
대단하십니다. -_-b
자꾸 무언가를 더 알아야겠다는 생각 밖에 드는 것이 없네요.
ROW_NUMBER(), MAX()를 사용해서 전에 구했었는데 도무지 기억이 나질 않네요

저의 해결방법은. COUNT(있는값컬럼) OVER (ORDER BY 기준열)해서

위에 집합과 같이 순서를 매긴후

MAX(이빨 빠진 컬럼) OVER (PARTITION BY 순서매긴컬럼) 해서

값을 계산했습니다.


아무쪼록 감사합니다.


by 마농 [2009.11.26 13:39:29]
SELECT no
, MIN(no_1) OVER(PARTITION BY gb) no_1
, MIN(v1) OVER(PARTITION BY gb) v1
, MIN(v2) OVER(PARTITION BY gb) v2
FROM
(
SELECT a.no, b.no no_1, b.v1, b.v2
, COUNT(b.no) OVER(ORDER BY a.no) gb
FROM a, b
WHERE a.no = b.no(+)
)
;

by 마농 [2009.11.26 13:44:05]
SELECT a.no
, MAX(b.no) no_1
, MAX(v1) KEEP(DENSE_RANK LAST ORDER BY b.no) v1
, MAX(v2) KEEP(DENSE_RANK LAST ORDER BY b.no) v2
FROM a, b
WHERE a.no >= b.no
GROUP BY a.no
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입