(*주의 : 출처는 내 머릿속)
Q. 테이블 안에 사람들의 방문 기록을 저장해 두었다고 하자.
데이터를 아이디 별로 묶고 아이디 마다 가장 최근 방문 기록만 추출해 보겠다.
NAME VISIT_DATA ID
홍길동 19/08/06 1
홍길동 19/08/08 1
홍길동 19/08/03 1
김수진 19/08/28 2
김수진 19/08/01 2
인은서 19/07/18 3
인은서 19/08/13 3
인은서 19/08/03 3
인은서 19/08/14 3
Step 1. RANK() 함수 이용하기 ( PARTITION = 그룹 조건 , ORDER BY = 그룹내 순서 조건 )
SELECT NAME, ID, REGISTER_DATE,
RANK() OVER (PARTITION BY ID ORDER BY TO_CHAR(VISIT_DATE, 'YYYYMMDD') DESC) AS RNK
FROM TEST_2
NAME VISIT_DATE ID RNK
홍길동 1 19/08/08 1
홍길동 1 19/08/06 2
홍길동 1 19/08/03 3
김수진 2 19/08/28 1
김수진 2 19/08/01 2
인은서 3 19/08/14 1
인은서 3 19/08/13 2
인은서 3 19/08/03 3
인은서 3 19/07/18 4
ID 로 그룹을 만들었기 때문에 ID 별로 가장 큰 VISIT_DATE부터 내림차순으로 RNK 가 만들어 진것을 볼수 있다.
Step2. RNK = 1 조건 두기 ( Step1 쿼리를 한번 감싸고 RNK = 1 이라는 WHERE 조건을 추가한다.
SELECT *
FROM ( SELECT NAME, ID, REGISTER_DATE,
RANK() OVER (PARTITION BY ID ORDER BY TO_CHAR(VISIT_DATE, 'YYYYMMDD') DESC) AS RNK
FROM TEST_2 )
WHERE RNK = '1'
<최종 결과>
NAME VISIT_DATE ID RNK
홍길동 1 19/08/08 1
김수진 2 19/08/28 1
인은서 3 19/08/14 1
* 사용자 별로 최근 방문 일자로만 뽑힌 데이터를 확인 할 수있다.