데이터 생성
with t (col1, col2, col3) AS (
SELECT '아파트1', 60, 30000 FROM DUAL UNION ALL
SELECT '아파트1', 60, 35000 FROM DUAL UNION ALL
SELECT '아파트1', 70, 40000 FROM DUAL UNION ALL
SELECT '아파트1', 80, 45000 FROM DUAL UNION ALL
SELECT '아파트2', 100, 50000 FROM DUAL UNION ALL
SELECT '아파트2', 120, 50000 FROM DUAL UNION ALL
SELECT '아파트3', 100, 50000 FROM DUAL UNION ALL
SELECT '아파트4', 100, 50000 FROM DUAL)
방법1 : ROW_NUMBER 활용
select decode(rn1,1,col1) col1 --2
, decode(rn2,1,col2) col2
, col3
from (
select col1,col2,col3
, row_number() over(partition by col1 order by col2,col3) rn1 --1
, row_number() over(partition by col1,col2 order by col3) rn2
from t);
- partition by로 아파트1, 아파트,2 아파트3, 아파트4로 그룹해서 번호매김 --1
- 그룹별로 row_number가 1인 행만 데이터 유지하고 나머지(2,3, ...)는 NULL로 바꿈 --2
방법2: LAG 활용
■ LAG OVER LAG(<열>, <N번째 = 1>, <디폴트>) OVER(ORDER BY ...)
LAG로 지정된 열의 N번째 상위 값을 가져옴
NULL은 디폴트 값으로 대체됨
OVER(ORDER BY )에서 지정한 열을 정렬할 기준 지정
■ LEAD OVER
LAG OVER 의 반대 개념 LEAD로 지정된 열의 N번째 하위 값을 가져옴
SELECT
DECODE(LAG(col1) OVER (ORDER BY col1,col2,col3),col1,NULL,col1) 아파트명
, DECODE(LAG(col2) OVER (PARTITION BY col1 ORDER BY col2,col3), col2, NULL, col2) 면적
, col3 가격
FROM t
ORDER BY t.col1, t.col2, t.col3;
- LAG로 1번째 상위 값을 가져옴
- LAG(col1)이, 즉 한칸 위의 col1값이 현재 col1과 같다면 NULL
- 아니면 데이터 유지
'DB > Oracle' 카테고리의 다른 글
[오라클] 계층구조 쿼리 (0) | 2020.05.25 |
---|