๐Ÿ–ฅ๏ธ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/SQL

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] [SQL] ๋ฉธ์ข…์œ„๊ธฐ์˜ ๋Œ€์žฅ๊ท  ์ฐพ๊ธฐ

rtw0202 2026. 3. 9. 19:39

1. ๋ฌธ์ œ ์„ค๋ช…

๋Œ€์žฅ๊ท ๋“ค์€ ์ผ์ • ์ฃผ๊ธฐ๋กœ ๋ถ„ํ™”ํ•˜๋ฉฐ, ๋ถ„ํ™”๋ฅผ ์‹œ์ž‘ํ•œ ๊ฐœ์ฒด๋ฅผ ๋ถ€๋ชจ ๊ฐœ์ฒด, ๋ถ„ํ™”๊ฐ€ ๋˜์–ด ๋‚˜์˜จ ๊ฐœ์ฒด๋ฅผ ์ž์‹ ๊ฐœ์ฒด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์‹คํ—˜์‹ค์—์„œ ๋ฐฐ์–‘ํ•œ ๋Œ€์žฅ๊ท ๋“ค์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ECOLI_DATA ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ECOLI_DATA ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ, IDPARENT_IDSIZE_OF_COLONYDIFFERENTIATION_DATEGENOTYPE ์€ ๊ฐ๊ฐ ๋Œ€์žฅ๊ท  ๊ฐœ์ฒด์˜ ID, ๋ถ€๋ชจ ๊ฐœ์ฒด์˜ ID, ๊ฐœ์ฒด์˜ ํฌ๊ธฐ, ๋ถ„ํ™”๋˜์–ด ๋‚˜์˜จ ๋‚ ์งœ, ๊ฐœ์ฒด์˜ ํ˜•์งˆ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ตœ์ดˆ์˜ ๋Œ€์žฅ๊ท  ๊ฐœ์ฒด์˜ PARENT_ID ๋Š” NULL ๊ฐ’์ž…๋‹ˆ๋‹ค.

๊ฐ ์„ธ๋Œ€๋ณ„ ์ž์‹์ด ์—†๋Š” ๊ฐœ์ฒด์˜ ์ˆ˜(COUNT)์™€ ์„ธ๋Œ€(GENERATION)๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์„ธ๋Œ€์— ๋Œ€ํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”. ๋‹จ, ๋ชจ๋“  ์„ธ๋Œ€์—๋Š” ์ž์‹์ด ์—†๋Š” ๊ฐœ์ฒด๊ฐ€ ์ ์–ด๋„ 1๊ฐœ์ฒด๋Š” ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


2. ์ถœ๋ ฅ ์˜ˆ์‹œ

 
3. ๋ฌธ์ œ ๋‹ต์•ˆ

WITH RECURSIVE generation AS (
    SELECT
        e.id,
        e.parent_id,
        1 AS g
    FROM ecoli_data e
    WHERE parent_id IS NULL # 1์„ธ๋Œ€
    
    UNION ALL
    
    SELECT
        e.id,
        e.parent_id,
        g.g + 1 AS g
    FROM generation g
    JOIN ecoli_data e
        ON e.parent_id = g.id
)

SELECT 
    COUNT(id) AS count,
    g AS generation
FROM generation
WHERE id NOT IN (SELECT # ๋ถ€๋ชจ๊ฐ€ ์•„๋‹Œ ๊ฐœ์ฒด == ์ž์‹์ด ์—†๋Š” ๊ฐœ์ฒด
                    parent_id 
                 FROM ecoli_data 
                 WHERE parent_id IS NOT NULL)
GROUP BY generation
ORDER BY generation ASC;