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

    ๊ฐœ์ธ ์Šคํ„ฐ๋”” ๊ธฐ๋ก์„ ๋ฉ”๋ชจํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ ํ‹€๋ฆฐ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ‹€๋ฆฐ ์  ์žˆ์„ ๊ฒฝ์šฐ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

     

    [MySQL/MariaDB] GROUP_CONCAT() ๊ฐ„๋‹จ ์‚ฌ์šฉ๋ฒ•(feat. ๋ฌธ์ž์—ด ๋ถ™์ด๊ธฐ)

    ๋ชฉ์ฐจ GROUP_CONCAT() ๊ฐ„๋‹จ ์‚ฌ์šฉ๋ฒ• ๐Ÿ˜ƒ ์—ญ์‹œ๋‚˜ ๋ฏธ๋ž˜์˜ ๋‚ด๊ฐ€ ๋ณด๊ธฐ์œ„ํ•ด ๊ธฐ๋กํ•จ ์—…๋ฌด๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ํŠน์ • ํ•„๋“œ๊ฐ’์„ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ€๋กœ๋กœ ๋ถ™์—ฌ์„œ ๋ณด์—ฌ์ค˜์•ผ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ ์‹œ ์ฟผ

    yaga.tistory.com

     

    [MySQL/MariaDB] merge(๊ฐ’์ด ์žˆ์œผ๋ฉด update, ์•„๋‹ˆ๋ฉด insert)(feat. ON DUPLICATE KEY UPDATE...)

    ๋ชฉ์ฐจMySQL INSERT INTO...ON DUPLICATE KEY UPDATE... ๐Ÿ˜ƒmysql์—๋„ Oracle์˜ merge into์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ๋˜์–ด ๋ฏธ๋ž˜์˜ ๋‚ด๊ฐ€ ๋ณด๊ธฐ์œ„ํ•ด ๊ธฐ๋กํ•จํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ…Œ์ด๋ธ” ํ•˜๋‚˜ ์ƒ์„ฑCREATE TABLE `test_220714` ( `id` big

    yaga.tistory.com

    ๋Œ“๊ธ€