RANK() ; 순위매기는함수 (그룹별 1건의 데이터 가져오기)
Q. 이름별 최종 등록된 전화번호 찾기
SELECT 이름
,전화번호
FROM (
SELECT RANK() OVER(PARTITION BY 이름 ORDER BY 등록일자 DESC ) RN
,이름
,전화번호
,등록일자
FROM (SELECT '홍길동' 이름, '011-1234-0000' 전화번호, '20101201' 등록일자 FROM DUAL UNION ALL
SELECT '홍길동' 이름, '011-1234-1111' 전화번호, '20101202' 등록일자 FROM DUAL UNION ALL
SELECT '홍길동' 이름, '011-1234-2222' 전화번호, '20101203' 등록일자 FROM DUAL UNION ALL
SELECT '김대한' 이름, '010-5678-0011' 전화번호, '20101201' 등록일자 FROM DUAL UNION ALL
SELECT '김대한' 이름, '010-5678-9999' 전화번호, '20101207' 등록일자 FROM DUAL
)
)
WHERE RN = 1
A. 조회 결과
"김대한"|"010-5678-9999"
"홍길동"|"011-1234-2222"
[출처] RANK() ; 순위매기는함수 (그룹별 1건의 데이터 가져오기)|작성자 장미
----------------------------------------------------------------
*. over() - count, row_number()의 쓰임.
select
count(n_name) over() as n_count,
row_number() over(order by n_name desc) as RNUM,
n_name,
n_phone,
n_date
from ( SELECT '1' n_name, '011-1234-0000' n_phone, '20101201' n_date FROM DUAL UNION ALL
SELECT '3' n_name, '011-1234-1111' n_phone, '20101202' n_date FROM DUAL UNION ALL
SELECT '2' n_name, '011-1234-2222' n_phone, '20101203' n_date FROM DUAL UNION ALL
SELECT '5' n_name, '010-5678-0011' n_phone, '20101201' n_date FROM DUAL UNION ALL
SELECT '4' n_name, '010-5678-9999' n_phone, '20101207' n_date FROM DUAL
);
A. 결과
5 1 5 010-5678-0011 20101201
5 2 4 010-5678-9999 20101207
5 3 3 011-1234-1111 20101202
5 4 2 011-1234-2222 20101203
5 5 1 011-1234-0000 20101201
'DataBase > Sql' 카테고리의 다른 글
[Sql] Oracle - sql정리_요약 (0) | 2011.08.11 |
---|---|
[Sql] Oracle - MONTHS_BETWEEN 월단위 계산 (0) | 2011.07.28 |
[Sql] Oracle - REGEXP(정규식) 사용법 (0) | 2011.07.28 |
[Sql] Oracle - Self Training 오라클 정리 (0) | 2011.07.12 |
[Sql] NVL(컬럼명, 0) 대신에 getDouble("컬럼명") 을 사용하자. (0) | 2011.06.21 |