본문 바로가기

데이터베이스

KEEP DENSE_RANK 함수 변환 Oracle -> PostgreSQL

(테이블을 T, 컬럼을 C, 등록일자를 RegDt 로 표현했을 경우) T에서 가장 최근에 등록된 데이터 값중 C의 가장 큰 값은?

*(가독성을 위해 변수명만 BOLD)

 

SELECT

   MAX(C)

FROM

   T

WHERE

   RegDt = (SELECT MAX(RegDt) FROM T);

 

위 데이터를 오라클에서 KEEP DENSE_RANK 함수를 써서 표현하면 다음과 같다.

SELECT

   MAX(C) KEEP(DENSE_RANK FIRST ORDER BY RegDt DESC)

FROM

   T;

 

위 함수를 PostgreSQL 로 이관하다가 그대로 사용하지 못한다는 것을 깨달았다. 더 효율적인 방법이야 많겠지만, 구글링 좀 뒤져보니까 좀 복잡하더라도 이게 가장 이해가 잘 돼서 난 이렇게 씀.

 

WITH exampleName AS

(

   SELECT

     MAX(C) C

     ,DENSE_RANK() OVER (ORDER BY RegDt DESC) AS RNK

   FROM

     T

)

SELECT C FROM exampleName WHERE RNK=1;

 

말 그대로 RegDt를 역순 정렬한 것 중에 랭킹 1위(rnk = 1) 인 데이터를 추출하면 된다.

OVER 뒤에있는 괄호절 안에 GROUP BY 해주고 싶은 데이터가 있을 경우 PATRITION BY 를 앞에 추가하면 된다.

가령 C2에 대해 묶어서 정렬하고 싶다면

DENSE_RANK() OVER (PARTITION BY C2 ORDER BY RegDt DESC) AS RNK 

가 되는 것이다.

 

위 구문을 줄여서 WITH 구문 없이 아래와 같이 사용할 수 있다.

SELECT

   C

FROM

   (SELECT

     MAX(C) C

     ,DENSE_RANK() OVER (ORDER BY RegDt DESC) AS RNK

   FROM

     T)

WHERE

   RNK = 1;

 

 

'데이터베이스' 카테고리의 다른 글

SQL에서 datetime타입을 java에서 insert  (0) 2019.06.09
오라클 명령어  (0) 2019.02.13