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);
그룹별로 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;