(테이블을 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 |