IT/DataBase

[MSQL] ROWNUM 역순으로 계산하는 SQL 기법

어흥꼬비 2025. 1. 19.

목차

    샘플 쿼리

    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

    개인 스터디 기록을 메모하는 공간이라 틀린점이 있을 수 있습니다.

    틀린 점 있을 경우 댓글 부탁드립니다.

    댓글