목차
샘플 쿼리
WITH TB1 AS (
SELECT 1 AS SEQ, 'user' AS SEARCH_TYPE, '홍길동' AS SEARCH_NM, '2025-01-01 12:00:00' AS CREATED_AT
UNION ALL
SELECT 2 AS SEQ, 'bussiness' AS SEARCH_TYPE, 'ABC Corp' AS SEARCH_NM, '2025-01-02 14:00:00' AS CREATED_AT
UNION ALL
SELECT 3 AS SEQ, 'user' AS SEARCH_TYPE, '이순신' AS SEARCH_NM, '2025-01-01 09:00:00' AS CREATED_AT
),
TB2 AS (
SELECT 1 AS MEMB_ID, '홍길동' AS NAME
UNION ALL
SELECT 2 AS MEMB_ID, 'ABC Corp' AS NAME
)
SELECT
B.REVERSE_ROWNUM, -- 역순 ROWNUM
B.SEQ,
B.SEARCH_TYPE,
B.SEARCH_NM,
B.CREATED_AT
FROM (
SELECT
A.*,
COUNT(*) OVER() AS TOTALROW,
-- 역순 정렬
(COUNT(*) OVER() - ROW_NUMBER() OVER(ORDER BY A.CREATED_AT DESC, A.SEARCH_NM ASC) + 1) AS REVERSE_ROWNUM
FROM (
SELECT
A.SEQ,
CASE
WHEN A.SEARCH_TYPE = 'user' THEN '개인'
WHEN A.SEARCH_TYPE = 'bussiness' THEN '기업'
ELSE '기타'
END AS SEARCH_TYPE,
A.SEARCH_NM,
DATE_FORMAT(A.CREATED_AT, '%Y.%m.%d %H:%i') AS CREATED_AT
FROM TB1 A
LEFT OUTER JOIN TB2 B ON A.SEQ = B.MEMB_ID
) A
) B
;
딱 봐도 핵심은 다음 부분이다.
(COUNT(*) OVER() - ROW_NUMBER() OVER(ORDER BY A.CREATED_AT DESC, A.SEARCH_NM ASC) + 1) AS REVERSE_ROWNUM
(COUNT(*) OVER()를 통해 전체 행 수에서 ROW_NUMBER()로 정렬해서 생성된 번호를 빼고 1을 더한다.
위 예제에서는 전체 행 수는 3이고 ROW_NUMBER()를 빼고 1을 더하면 아래와 같다.
ROWNUM | REVERSE_ROWNUM |
1 | 3 |
2 | 2 |
3 | 1 |
ROW_NUMBER()가 1일 경우 REVERSE_ROWNUM은 (3 - 1) + 1 = 3
ROW_NUMBER()가 2일 경우 REVERSE_ROWNUM은 (3 - 2) + 1 = 2
ROW_NUMBER()가 3일 경우 REVERSE_ROWNUM은 (3 - 3) + 1 = 1
개인 스터디 기록을 메모하는 공간이라 틀린점이 있을 수 있습니다.
틀린 점 있을 경우 댓글 부탁드립니다.
'IT > DataBase' 카테고리의 다른 글
[SQL] 백분율 예제 (31) | 2024.03.20 |
---|---|
[cubrid] 서브 쿼리 별칭 사용 시 주의점 (43) | 2024.01.13 |
[Oracle] N개월후까지 날짜 구하기 (feat. Connect by level) (65) | 2023.12.03 |
[DBMS] N:M(다대다) 관계일 때 매핑 테이블로 관계 형성 (61) | 2023.09.24 |
[Oracle] ORDER BY 시 조건 처리 (56) | 2023.09.24 |
댓글