<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>인사이트를 얻기 위한 journey</title>
        <link>https://velog.io/</link>
        <description>질문 없는 성장은 없다. 3년차 데이터 분석가</description>
        <lastBuildDate>Sat, 30 Aug 2025 16:00:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>인사이트를 얻기 위한 journey</title>
            <url>https://velog.velcdn.com/images/dorong_park/profile/1116830c-30d5-4426-a30a-fd4233fb0aab/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 인사이트를 얻기 위한 journey. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dorong_park" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[IN 조건]]></title>
            <link>https://velog.io/@dorong_park/IN-%EC%A1%B0%EA%B1%B4</link>
            <guid>https://velog.io/@dorong_park/IN-%EC%A1%B0%EA%B1%B4</guid>
            <pubDate>Sat, 30 Aug 2025 16:00:12 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-31">📆 날짜: 2025-08-31</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스/업그레이드 할 수 없는 아이템 구하기
]</li>
<li><strong>문제 링크</strong>: [<a href="https://school.programmers.co.kr/learn/courses/30/lessons/273712%5D">https://school.programmers.co.kr/learn/courses/30/lessons/273712]</a></li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[예: &#39;아이템 중 업그레이드 할 수 없는 아이템 정보 추출하기&#39;]</li>
</ul>
<hr>
<h3 id="❌-나의-오답-코드">❌ 나의 오답 코드</h3>
<pre><code class="language-sql">-- 코드를 작성해주세요
select
    I.ITEM_ID,
    I.ITEM_NAME,
    I.RARITY
from
    ITEM_INFO I
    JOIN ITEM_TREE T ON T.ITEM_ID = I.ITEM_ID
WHERE
    T.PARENT_ITEM_ID IS NOT NULL # -- 먼저 NULL값 조건
    I.ITEM_ID NOT IN # -- PARENT_ID에 속하지 않은 ITME_ID는 업그레이드 할 수 없음
    (SELECT
        ITEM_ID
    FROM
        ITEM_TREE
    WHERE
        ITEM_ID IN
            (SELECT 
                PARENT_ITEM_ID 
            FROM
                ITEM_TREE
            )
     )
ORDER BY
    ITEM_ID DESC



🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: &#39;부분 정답으로 WHERE 조건의 순서가 잘못됨.&#39;]

근본적인 실수: [예: &#39;IN절에 대한 오해&#39;]

헷갈렸던 개념: [예: &#39;IN 절 뒤에는 컬럼이 올 수 없으며 리스트가 와야 함.&#39;]</code></pre>
<h3 id="in-절">IN 절</h3>
<pre><code>(X 잘못된 예시)
SELECT 
    ITME_ID
FROM
    TABLE
WHERE
    ITEM_ID IN PARENT_ITEM_ID (X) -----&gt; 대뜸 컬럼을 집어 넣으면 안됨

(O 정답 예시)
SELECT 
    ITME_ID
FROM
    TABLE
WHERE
    ITEM_ID IN ------------------ (O) ---&gt; SELECT 절의 컬럼을 넣어 리스트 형태로
    (SELECT PARENET_ITEM_ID
    FROM TABLE)


</code></pre><hr>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">

SELECT 
    ITEM_ID, 
    ITEM_NAME, 
    RARITY
FROM 
    ITEM_INFO
WHERE 
    ITEM_ID NOT IN (
    SELECT 
        DISTINCT PARENT_ITEM_ID --- 굳이 서브쿼리를 2번 쓰지 않음
    FROM 
        ITEM_TREE
    WHERE 
        PARENT_ITEM_ID IS NOT NULL -- NULL인 데이터 선 제거
)
ORDER BY 
    ITEM_ID DESC

</code></pre>
<ul>
<li>핵심 로직: PARENT_ITEM_ID에 속하지 않는 ITEM_ID는 더이상 업그레이드 할 수 없음</li>
</ul>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: IN </p>
</li>
<li><p>배운 점:
ㄴIN 뒤에는 <strong>서브쿼리나, 값</strong> 리스트가 나와야 한다
EX) WHERE ITME_ID IN (SELECT ITEM_ID FROM MAIN)
EX) WHERE ITEM_NAME IN (&#39;강남구청&#39;,&#39;강남양재&#39;)</p>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[재귀 함수]]></title>
            <link>https://velog.io/@dorong_park/%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@dorong_park/%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 26 Aug 2025 14:13:02 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-26">📆 날짜: 2025-08-26</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스/입양 시각 구하기(2)]</li>
<li><strong>문제 링크</strong>: [<a href="https://school.programmers.co.kr/learn/courses/30/lessons/59413%5D">https://school.programmers.co.kr/learn/courses/30/lessons/59413]</a></li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[예: &#39;0~23시 까지의 입양 시각대별 입양 카운팅하기&#39;]</li>
</ul>
<hr>
<h3 id="❌-나의-오답-코드">❌ 나의 오답 코드</h3>
<pre><code class="language-sql">-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
SELECT 1
UNION ALL
SELECT 2
....

이런식으로 23까지 감 ---&gt; 비효율적

🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: &#39;정답이긴 하지만 상대적 비효율적인 쿼리(하드코딩).&#39;]

근본적인 실수: [예: &#39;재귀함수를 평소 쓰지 않아 활용도가 낮아 까먹음.&#39;]

헷갈렸던 개념: [예: &#39;&#39;]</code></pre>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">WITH RECURSIVE TimeNumbers (hour,COUNT) AS (
    -- 재귀의 시작점
    SELECT 
        0 AS HOUR,
        0 AS COUNT
    UNION ALL
    -- 반복되는 부분
    SELECT 
        hour + 1 AS HOUR,
        0 AS COUNT
    FROM TimeNumbers
    WHERE hour &lt; 23
)
SELECT
    T.HOUR,
    CASE WHEN
    MAIN.HOUR IS NULL THEN T.COUNT
    ELSE MAIN.COUNT END AS COUNT
FROM
    TimeNumbers T
LEFT JOIN
(SELECT
    HOUR(DATETIME) AS HOUR,
    COUNT(ANIMAL_ID) AS COUNT
FROM
    ANIMAL_OUTS 
GROUP BY
    1
ORDER BY
    1
) AS MAIN ON MAIN.HOUR = T.HOUR
ORDER BY
    1
</code></pre>
<ul>
<li>핵심 로직: <ul>
<li>재귀 함수로 0부터 23시 까지 나오도록 재귀의 시작점과 반복되는 부분을 UNION ALL 하며, WHERE 조건에 24가 되기 전까지만 EXIT 조건 걸기</li>
<li>재귀 함수로 만들어진 테이블을 메인 테이블로 가져가서, LEFT 조인을 걸어 0~23시 시각이 사라지지 않게끔 조건 걸기</li>
<li>입양 테이블의 시각대가 없는 경우는 0, 있는 경우는 입양 테이블의 입양 빈도수를 카운팅 하는 컬럼으로 대체 (CASE WHEN문)</li>
</ul>
</li>
</ul>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: 재귀 함수 사용</p>
</li>
<li><p>배운 점:
ㄴ SELECT 절에 반복되는 숫자를 넣는 방법 = 재귀 함수 사용 (RECURSIVE)
(SELECT 1,2,3,4,.... 특정 숫자) 이런식으로 넣는 방법을 무식하게
SELECT 1
UNION ALL
SELECT 2 ... 이런식으로 하면 너무 비효율적이다.</p>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[단 한개의 기록 확인하기]]></title>
            <link>https://velog.io/@dorong_park/%EB%8B%A8-%ED%95%9C%EA%B0%9C%EC%9D%98-%EA%B8%B0%EB%A1%9D-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dorong_park/%EB%8B%A8-%ED%95%9C%EA%B0%9C%EC%9D%98-%EA%B8%B0%EB%A1%9D-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 18 Aug 2025 13:34:55 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-07">📆 날짜: 2025-08-07</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스/자동차 대여 기록에서 대여중 ,대여 가능 여부 구분하기]</li>
<li><strong>문제 링크</strong>: [<a href="https://school.programmers.co.kr/learn/courses/30/lessons/157340%5D">https://school.programmers.co.kr/learn/courses/30/lessons/157340]</a></li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[예: &#39;2022-10-16 기준 대여 가능한 자동차 확인하기&#39;]</li>
</ul>
<hr>
<h3 id="❌-나의-오답-코드">❌ 나의 오답 코드</h3>
<pre><code class="language-sql">-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
with main as(

select

    car_id,

    start_date,

    end_date,

    case when start_date &lt;=date_format(&#39;2022-10-16&#39;,&#39;%Y-%m-%d&#39;) and

    end_date &gt;=date_format(&#39;2022-10-16&#39;,&#39;%Y-%m-%d&#39;) then &#39;대여중&#39;

    else &#39;대여 가능&#39;

    end as AVAILABILITY

from

    CAR_RENTAL_COMPANY_RENTAL_HISTORY 

order by 1 desc

)

select

    distinct

    car_id,

    first_value(AVAILABILITY) over (partition by car_id order by end_date desc) as AVAILABILITY

from

    main 

order by

    1 desc

🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: &#39;end_date가 느린 날짜의 데이터를 이용가능 데이터 값으로 가져오는 논리, 즉 가장 최근에 반납된 기록의 상태가 그 자동차의 최종 상태일 것이라는 가정.&#39;]

근본적인 실수: [예: &#39;가장 최근의 반납 기록이 마지막 상태가 아닐 수도 있음

1번 기록: 2022-10-10 ~ 2022-10-20 (반납일: 10-20) -&gt; &#39;대여중&#39;

2번 기록: 2022-11-05 ~ 2022-11-15 (반납일: 11-15) -&gt; &#39;대여 가능&#39; ---&gt; 해당 값으로 매칭되면 틀릴 수도 있음]

</code></pre>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">SELECT
    CAR_ID,
    CASE 
        WHEN MAX(AVAILABILITY_FLAG) = 1 THEN &#39;대여중&#39; --- ② 2022-10-16 기간이 있는 경우는 무조건 대여중
        ELSE &#39;대여 가능&#39;
    END AS AVAILABILITY
FROM (
    SELECT 
        CAR_ID,
        CASE 
            WHEN &#39;2022-10-16&#39; BETWEEN START_DATE AND END_DATE THEN 1
            ELSE 0 --- ① 대여 기간안에 속하면 1이라는 표시
        END AS AVAILABILITY_FLAG
    FROM 
        CAR_RENTAL_COMPANY_RENTAL_HISTORY
) AS SUBQUERY

GROUP BY 
    CAR_ID
ORDER BY 
    CAR_ID DESC;
</code></pre>
<h1 id=""><img src="https://velog.velcdn.com/images/dorong_park/post/0d6c11a6-188f-489d-83ca-bf2ca6cd330e/image.png" alt=""></h1>
<h1 id="-1"><img src="https://velog.velcdn.com/images/dorong_park/post/e942096d-a9a2-4796-9d31-4ec3df5c7bd4/image.png" alt=""></h1>
<h1 id="-2"><img src="https://velog.velcdn.com/images/dorong_park/post/8717931c-af3c-42fd-88e7-a5f07cb530aa/image.png" alt=""></h1>
<h1 id="-3"><img src="https://velog.velcdn.com/images/dorong_park/post/89500cd7-1713-4599-ac5c-46a4e15783cd/image.png" alt=""></h1>
<ul>
<li>핵심 로직: 특정 기간 안에 속하는 지점을 숫자로 flag 표시하고, 그 값에 해당 하면 특정 str 지정</li>
</ul>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: flag 지정하는 법</p>
</li>
<li><p>배운 점:
특정 시점을 단순 첫번째, 마지막 데이터로 확인 할 수 없는 경우는 flag를 써서 해당 값이 어디에 해당 하는지 표시하는 방법에 대해 배웠다.</p>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[윈도우함수]]></title>
            <link>https://velog.io/@dorong_park/%EC%9C%88%EB%8F%84%EC%9A%B0%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@dorong_park/%EC%9C%88%EB%8F%84%EC%9A%B0%ED%95%A8%EC%88%98</guid>
            <pubDate>Fri, 15 Aug 2025 15:27:34 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-16">📆 날짜: 2025-08-16</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스/연도별 대장균 크기의 편차 구하기]</li>
<li><strong>문제 링크</strong>: [<a href="https://school.programmers.co.kr/learn/courses/30/lessons/299310%5D">https://school.programmers.co.kr/learn/courses/30/lessons/299310]</a></li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[예: &#39;연도별 가장 큰 대장균의 사이즈와 id별 편차를 구하기&#39;]</li>
</ul>
<hr>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: 집계 함수의 윈도우 함수</p>
</li>
<li><p>배운 점:</p>
<ul>
<li>윈도우 함수의 컬럼 값 지정이 헷갈린다. sum/average/max/min/count 의 집계 함수는 컬럼을 지정해주어야 한다.</li>
<li>하지만, 순위 윈도우 함수(rank/row_number/dense_rank) 같은 경우에는 뒤에 컬럼이 필요 없다.
  <strong>- 어떻게 구분해야 할까?</strong> ▶** &quot;컬럼&quot; 값을 계산해야 하거나, 가져와야 하는가?** → 필요 시 컬럼 지정 <pre><code>  → 필요 없을 시 컬럼 X (단순 행의 위치나 순서에 의해 자동 계산)</code></pre></li>
</ul>
</li>
</ul>
<blockquote>
<p>집계 함수의 윈도우 함수 경우에는 특정 컬럼 값을 가지고 계산하며, 그 대상은 ( ) 괄호 안에 반드시 대상이 될 컬럼명을 기재해야한다.
ex) max*<em>(colony_size) *</em> over ( partition by year)</p>
</blockquote>
<blockquote>
<p>순위 함수의 윈도우 함수 경우에는 특정 컬럼 값을 가지고 올 필요 없이 행의 순서에 의해서 자동으로 순위 메김 (1~ n위)가 메겨지므로, 대상이 될 컬럼명을 기재할 필요가 없다
ex) dense_rank() over (order by salary desc) → 샐러리 높은 순서대로 자동 순서 메김</p>
</blockquote>
<blockquote>
<p>lag/lead() 윈도우 함수 같은 경우에도 특정 컬럼의 값을 가져와서 앞/뒤 값을 가져올 수 있으므로 컬럼명을 기재해야 한다.
ex) lead(salary) over ( order by date) → 시간 순서대로 뒷사람의 샐러리를 가져와야 함</p>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[재귀함수]]></title>
            <link>https://velog.io/@dorong_park/%EC%9E%AC%EA%B7%80%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@dorong_park/%EC%9E%AC%EA%B7%80%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 13 Aug 2025 15:38:31 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-14">📆 날짜: 2025-08-14</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스/멸종위기의 대장균 찾기]</li>
<li><strong>문제 링크</strong>: [<a href="https://school.programmers.co.kr/learn/courses/30/lessons/301651%5D">https://school.programmers.co.kr/learn/courses/30/lessons/301651]</a></li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[예: &#39;자식이 없는 대장균 찾기&#39;]</li>
</ul>
<hr>
<h3 id="❌-나의-오답-코드">❌ 나의 오답 코드</h3>
<pre><code class="language-sql">-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
WITH KID AS (
SELECT
    ID,
    CASE WHEN
        ID IN (SELECT PARENT_ID FROM ECOLI_DATA) THEN 1
        ELSE 0 END AS KID_CNT
FROM
    ECOLI_DATA

)



🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: &#39;자식이 없는 케이스를 WITH절로 빼고, 세대를 구하는 식을 생각했지만 떠오르지 않음&#39;]

근본적인 실수: [예: &#39;재귀함수를 생각할 수 없었음&#39;]

헷갈렸던 개념: [예: &#39;.&#39;]</code></pre>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">WITH RECURSIVE GENERATION_DATA
AS(
SELECT
    ID,
    1 AS GENERATION #--- 1세대 (부모세대가 없는 경우)
FROM
    ECOLI_DATA
WHERE
    PARENT_ID IS NULL
UNION ALL

SELECT
    E.ID,
    G.GENERATION +1 #--- 부모세대 +1 = 자식세대
FROM
    ECOLI_DATA E
    JOIN GENERATION_DATA G ON G.ID = E.PARENT_ID #--- 자식과 부모세대 연결
)
SELECT
    COUNT(*) AS COUNT,
    GENERATION # ---세대 별 무자식 개체 카운팅
FROM
    GENERATION_DATA 
WHERE
    ID NOT IN 
    (SELECT DISTINCT PARENT_ID FROM ECOLI_DATA WHERE PARENT_ID IS NOT NULL) # -- 서브쿼리: 부모 명단에 속하지 않는 ID
GROUP BY
    GENERATION
ORDER BY
    GENERATION
</code></pre>
<ul>
<li>핵심 로직: 재귀함수로 ID별 세대를 세고, 서브쿼리로 자식이 없는 개체를 WHERE 조건절로 가져가는 것이 포인트</li>
</ul>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: RECURSIVE 함수</p>
</li>
<li><p>배운 점:
ㄴSQL 재귀는 주로 WITH RECURSIVE 구문(CTE)를 사용해 구현하며, 핵심 요소는 
① 앵커 멤버: 재귀의 시작점. 단 한번만 실행
② 재귀 멤버: 앵커 멤버나 이전의 재귀 단계를 참조하여 반복적으로 실행되는 쿼리
ㄴ 예시</p>
<pre><code>WITH RECURSIVE NumberSeries AS (
  -- 1. 앵커 멤버: 시작 숫자 1을 선택
  SELECT 1 AS n

  UNION ALL

  -- 2. 재귀 멤버: 이전 단계의 숫자에 1을 더한다
  SELECT n + 1
  FROM NumberSeries
  WHERE n &lt; 5 -- 종료 조건: n이 5가 되면 더 이상 재귀하지 않는다
)
</code></pre></li>
</ul>
<p>-- 최종 결과 선택
SELECT * FROM NumberSeries;
*결과 값: 1,2,3,4,5
*입력값/출력값
1 ---&gt; 앵커부분 (출력값만 존재)
N=1 /2 ---&gt; 여기서 부터 재귀 부분
N=2 /3
N=3/4
N=4/5
N=5 ---&gt; STOP: WHERE 조건이 N&lt;5 이므로</p>
<p>```</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[N% 구하기]]></title>
            <link>https://velog.io/@dorong_park/%EB%B6%84%EC%9C%84-%EC%88%98-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@dorong_park/%EB%B6%84%EC%9C%84-%EC%88%98-%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 12 Aug 2025 14:08:16 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-12">📆 날짜: 2025-08-12</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [프로그래머스,대장균의 크기에 따라 분류하기 2]</li>
<li><strong>문제 링크</strong>: [<a href="https://school.programmers.co.kr/learn/courses/30/lessons/301649%5D">https://school.programmers.co.kr/learn/courses/30/lessons/301649]</a></li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[대장균 개체의 크기를 내름차순으로 정렬시 4등분 하여 각 등급 메김]</li>
</ul>
<hr>
<h3 id="❌-나의-오답-코드">❌ 나의 오답 코드</h3>
<pre><code class="language-sql">-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
# -- 코드를 작성해주세요
WITH MAIN AS (
SELECT
    ID,
    ROW_NUMBER() OVER (ORDER BY SIZE_OF_COLONY DESC),
    (SELECT COUNT(ID) FROM ECOLI_DATA ),
    ROW_NUMBER() OVER (ORDER BY SIZE_OF_COLONY DESC)/(SELECT COUNT(ID) FROM ECOLI_DATA ) AS RATIO

FROM
    ECOLI_DATA 
)
SELECT
    ID,
    CASE WHEN
        1-RATIO &lt;=0.24 THEN &#39;LOW&#39;
        WHEN
         1-RATIO &lt;=0.49 AND  1-RATIO &gt;=0.25  THEN &#39;MEDIUM&#39;
         WHEN
         1-RATIO &lt;=0.74 AND  1-RATIO &gt;=0.5  THEN &#39;HIGH&#39;
         WHEN
         1-RATIO &gt;=0.75 THEN &#39;CRITICAL&#39;
         END COLONY_NAME
FROM
    MAIN
order by
    1

🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: &#39;정수 나눗셈인 경우 SQL에서는 소숫점까지 표현 안되고 정수로 나오게 됨
EX) 5/25 = 0.2 (X), 0 .&#39;]

근본적인 실수: [예: &#39;당연히 소숫점 계산이 될 줄 알았음.&#39;]

헷갈렸던 개념: [예: &#39;순위 함수 삼형제가 늘 헷갈림.&#39;]</code></pre>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">WITH COLONY_RANK AS (
    SELECT
        ID,
        -- ROW_NUMBER()를 사용해 순위(RN)를 매깁니다.
        ROW_NUMBER() OVER (ORDER BY SIZE_OF_COLONY DESC) AS RN,
        -- 윈도우 함수로 전체 개수(TOTAL_COUNT)를 효율적으로 구합니다.
        COUNT(*) OVER() AS TOTAL_COUNT
    FROM
        ECOLI_DATA
)

SELECT
    ID,
    CASE
        -- RN에 1.0을 곱해 &#39;정수 나눗셈&#39; 문제를 해결합니다.
        WHEN (RN * 1.0 / TOTAL_COUNT) &lt;= 0.25 THEN &#39;CRITICAL&#39;
        WHEN (RN * 1.0 / TOTAL_COUNT) &lt;= 0.50 THEN &#39;HIGH&#39;
        WHEN (RN * 1.0 / TOTAL_COUNT) &lt;= 0.75 THEN &#39;MEDIUM&#39;
        ELSE &#39;LOW&#39;
    END AS COLONY_NAME
FROM
    COLONY_RANK
ORDER BY
    ID ASC;
</code></pre>
<hr>
<pre><code class="language-여기에">
</code></pre>
<ul>
<li>핵심 로직: 
ㄴ 순위/총 ROWS 갯수 = 상위 n% 값 이라는 논리는 맞았음
ㄴ 서브쿼리 절을 사용 할 경우 각 행 마다 (select count(*) from ...)을 반복 실행 하게되어 속도가 느림
ㄴ 윈도우 함수는 전체에서 딱 한번 실행 되어 속도가 빠름</li>
</ul>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: 윈도우 함수의 목적, 정수를 나눌 경우 소숫점 미반영 문제, 순위 함수</p>
</li>
<li><p>배운 점:</p>
</li>
</ul>
<p>① 윈도우 함수 개념 복습</p>
<ul>
<li>사용 목적: <strong>원래 테이블의 열은 그대로 유지 하면서, 다른 열만 추가</strong>하고 싶을때
EX) 각 행의 순위 계산, 각 행의 누적합 계산, 각 행의 다음 행 계산 등</li>
</ul>
<pre><code>-- 누적 합 계산
SELECT
    ORDER_DATE,
    SUM(DAILY_SALES) OVER (ORDER BY ORDER_DATE) AS RUNNING_TOTAL
FROM
    sales</code></pre><pre><code>SELECT
    ID,
    SALES,
    RANK() OVER (ORDER BY SALES DESC) AS SALES_RANK -- 판매 내림차순 순위
FROM
    sales</code></pre><pre><code>SELECT
    sale_month,
    sale_AMOUNT,
    LAG(SALES_AMOUNT,1,0) OVER (ORDER BY SALES_MONTH) ---- 이전 달의 매출 가져오기
FROM
    monthly_sales</code></pre><hr>
<h1 id=""><img src="https://velog.velcdn.com/images/dorong_park/post/79e7dcde-2b88-40e5-9628-b4e92f5636ac/image.png" alt=""></h1>
<h1 id="-1"><img src="https://velog.velcdn.com/images/dorong_park/post/20d50498-23b4-47e2-beab-f870d65ae933/image.png" alt=""></h1>
<p>② 정수를 정수로 나눌 경우</p>
<ul>
<li>SQL 에서 정수/정수 일 경우 정수로 나오기 때문에 1/5 =0.2(X), 1/5 =0 
분자의 정수 타입 같은 경우 1.0이라는 어거지 소숫점 패턴이 필요하다.
EX) 1 * 1.0 / 5 = 0.2</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[메인 테이블 선택]]></title>
            <link>https://velog.io/@dorong_park/%EC%B5%9C%EB%8C%80%ED%95%9C-%EC%89%BD%EA%B2%8C-%EC%83%9D%EA%B0%81%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dorong_park/%EC%B5%9C%EB%8C%80%ED%95%9C-%EC%89%BD%EA%B2%8C-%EC%83%9D%EA%B0%81%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 09 Aug 2025 01:54:48 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-07">📆 날짜: 2025-08-07</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스/업그레이드 된 아이템 구하기]</li>
<li><strong>문제 링크</strong>: (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/273711">https://school.programmers.co.kr/learn/courses/30/lessons/273711</a>)</li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[예: &#39;업그레이드 가능한 아이템 정보 추출&#39;]</li>
<li>조건 값: RARE 아이템 대상, 아이템 ID 기준 내림차순</li>
</ul>
<hr>
<h3 id="❌-나의-오답-코드-비효율-코드">❌ 나의 오답 코드 (비효율 코드)</h3>
<pre><code class="language-sql">-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
SELECT
    TREE2.ITEM_ID,
    INFO2.ITEM_NAME,
    INFO2.RARITY
FROM
    ITEM_INFO INFO
    JOIN ITEM_TREE TREE ON INFO.ITEM_ID = TREE.ITEM_ID
    JOIN ITEM_TREE TREE2 ON TREE.ITEM_ID = TREE2.PARENT_ITEM_ID
    JOIN ITEM_INFO INFO2 ON INFO2.ITEM_ID = TREE2.ITEM_ID
WHERE
    INFO.RARITY =&#39;RARE&#39;
ORDER BY
    1 DESC;

🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: &#39;정답이긴 하지만 조인을 3번을 씀.&#39;]

근본적인 실수: [예: &#39;TREE 테이블을 메인 테이블로 가져가야 하는데, INFO 테이블을 메인으로 가져가다 보니 여러번 조인을 하게됨&#39;]

헷갈렸던 개념: [예: &#39;없음&#39;]</code></pre>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">SELECT
    T.ITEM_ID,
    I.ITEM_NAME,
    I.RARITY
FROM
    ITEM_TREE T
    JOIN ITEM_INFO I ON T.ITEM_ID = I.ITEM_ID
WHERE
    T.PARENT_ITEM_ID IN (
        SELECT ITEM_ID
        FROM ITEM_INFO
        WHERE RARITY = &#39;RARE&#39;
    )
ORDER BY
    T.ITEM_ID DESC;
</code></pre>
<ul>
<li>핵심 로직: TREE 테이블을 메인으로 하여 INFO 테이블과 ID로 조인하고, RARE 인 상품들은 WHERE 절 서브 쿼리로 만든다.</li>
</ul>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: </p>
</li>
<li><p>배운 점:
ㄴ 문제에서 요청하는 부분은 &quot;<strong>다음 업그레이드 아이템</strong>&quot;에 대한 정보였다. 다음 업그레이드 된 정보는 INFO 테이블이 아니라, TREE 테이블에서 확인이 가능하며, 이는 TREE 테이블로 메인 테이블을 잡고 시작했어야했다.
ㄴ 실무나 쿼리 테스트에서 어떤 테이블을 메인으로 잡고 시작할지 결정 하는 것은 쿼리의 효율성과 가독성에 크리티컬한 영향을 끼친다.</p>
</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/dorong_park/post/0ed32ab7-3377-45a9-ab58-589ab0c7eaca/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HAVING을 위한 GROUP BY]]></title>
            <link>https://velog.io/@dorong_park/HAVING%EC%9D%84-%EC%9C%84%ED%95%9C-GROUP-BY</link>
            <guid>https://velog.io/@dorong_park/HAVING%EC%9D%84-%EC%9C%84%ED%95%9C-GROUP-BY</guid>
            <pubDate>Sat, 09 Aug 2025 01:37:23 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-09">📆 날짜: 2025-08-09</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스/재구매가 일어난 상품과 회원 리스트 구하기]</li>
<li><strong>문제 링크</strong>: (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/131536">https://school.programmers.co.kr/learn/courses/30/lessons/131536</a>)</li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[예: &#39;재구매가 일어난 회원 리스트 조회&#39;]</li>
</ul>
<hr>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">-- 재구매 조건: USER_ID와 PRODUCT_ID가 동일해야 한다.
SELECT
    USER_ID,
    PRODUCT_ID
    # COUNT(USER_ID)
FROM
    ONLINE_SALE
GROUP BY
    1,2
HAVING
    COUNT(*) &gt;=2  #--- 2번 삼 = 재구매
ORDER BY
    1,2 DESC;
</code></pre>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: HAVING 조건을 쓰기 위한 GROUP BY </p>
</li>
<li><p>배운 점:
① GROUP BY를 쓸 수 있는 조건 </p>
<ul>
<li>집계 함수가 있는 경우, SELECT 절에 기재한 모든 컬럼</li>
<li>집계 함수가 없는 경우, SELECT 절에 기재한 모든 컬럼</li>
<li>SELECT 절에는 없지만 PRIMARY KEY인 경우
② HAVING<ul>
<li>SELECT 절에서 집계 함수를 쓰지 않은 경우 GROUP BY를 동일한 컬럼으로 명시 하고 그 이후에 HAVING을 적으면, WHERE과 같은 조건값을 넣을 수 있다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>4번 제외 모두 GROUP BY 뒤 컬럼을 제대로 기재함 (2개의 컬럼 모두 써야함)
<img src="https://velog.velcdn.com/images/dorong_park/post/d0a41714-4129-4660-9ef7-dd93b43c3b0b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DATE_FORMAT('%Y-%m-%d')]]></title>
            <link>https://velog.io/@dorong_park/%EC%97%AC%EB%9F%AC%EA%B0%80%EC%A7%80-%EC%8B%A4%EC%88%98%EB%93%A4</link>
            <guid>https://velog.io/@dorong_park/%EC%97%AC%EB%9F%AC%EA%B0%80%EC%A7%80-%EC%8B%A4%EC%88%98%EB%93%A4</guid>
            <pubDate>Sat, 09 Aug 2025 01:23:42 GMT</pubDate>
            <description><![CDATA[<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-09">📆 날짜: 2025-08-09</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스/3월에 태어난 여성 회원 목록 출력하기]</li>
<li><strong>문제 링크</strong>: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/131120">https://school.programmers.co.kr/learn/courses/30/lessons/131120</a></li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>3월에 태어난 여성의 id,이름,성별,생년월일 조회</li>
<li>조건: 연락처 없는 경우 제외, 회원 id 오름차순 정렬</li>
</ul>
<hr>
<h3 id="❌-나의-코드-오답x">❌ 나의 코드 (오답x)</h3>
<pre><code class="language-sql">-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
SELECT
    MEMBER_ID,
    MEMBER_NAME,
    GENDER,
    DATE_FORMAT(DATE_OF_BIRTH,&#39;%y-%m-%d&#39;)
FROM
    MEMBER_PROFILE
WHERE
    (MONTH(DATE_OF_BIRTH) = 3 AND GENDER= &#39;W&#39;)
    and
    TLNO IS NOT NULL
ORDER BY
    1


🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [&#39;date_format 함수에서 &#39;YYYY-MM-DD&#39;형식으로 쓰는 방법을 제대로 안익힘&#39;]

근본적인 실수: [예: &#39;
① 문제 조건을 제대로 안읽고, 아는 문제라고 쉽다고 생각 함. 
② DATE_FORMAT 관련 포멧팅을 잘 안익힘
]

헷갈렸던 개념: [예:&#39;없음&#39; ]</code></pre>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: DATE_FORMAT
ㄴ 2025-01-01 과 같은 형식으로 쓰려면 DATE_FORMAT(DATE, <strong>&#39;%Y-%m-%d&#39;)</strong>로 기재해야 함
ㄴ &#39;%y&#39; → 25
ㄴ &#39;%M&#39; → January 
ㄴ &#39;%D&#39; → 1st</p>
</li>
<li><p>배운 점:
ㄴ TEST 시 긴장 하므로, 조건을 더 꼼꼼히 읽어야 한다. 특히 정렬 및 제외 조건은 무조건 잘 캐치 해야 한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[셀프조인 문]]></title>
            <link>https://velog.io/@dorong_park/%EC%85%80%ED%94%84%EC%A1%B0%EC%9D%B8-%EB%AC%B8</link>
            <guid>https://velog.io/@dorong_park/%EC%85%80%ED%94%84%EC%A1%B0%EC%9D%B8-%EB%AC%B8</guid>
            <pubDate>Thu, 07 Aug 2025 15:36:18 GMT</pubDate>
            <description><![CDATA[<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-07">📆 날짜: 2025-08-07</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 리트코드/570. Managers with at Least 5 Direct Reports]</li>
<li><strong>문제 링크</strong>: <a href="https://leetcode.com/problems/managers-with-at-least-5-direct-reports/?envType=study-plan-v2&amp;envId=top-sql-50">https://leetcode.com/problems/managers-with-at-least-5-direct-reports/?envType=study-plan-v2&amp;envId=top-sql-50</a></li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>5명 이상의 직원을 갖고 있는 매니저 이름 조회</li>
</ul>
<hr>
<h3 id="❌-나의-오답-코드">❌ 나의 오답 코드</h3>
<pre><code class="language-sql">-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
select

    name

from (

select

    e2.name as name,

    count(*)

from

    employee e1

    join employee e2 on e1.id = e2.managerid

group by

    1

having

    count(*) &gt;=5

) as result


🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [&#39;문법적 오류는 없으나 join 조건을 완전 반대로 적음&#39;]

근본적인 실수: [예: &#39;
① 문제를 제대로 이해하지 않았고, 아는 문제라고 쉽다고 생각 함. 
② 테이블 alias를 더 명확하게 만들었어야 함 
(ex. e1, e2 라고 쓸 시 어떤 것이 직원테이블인지, 매니저 테이블인지 모름 → e,m으로 변경)
③ 조인 조건을 꼼꼼히 생각해 보는 습관 기르기&#39;]

헷갈렸던 개념: [예:&#39;없음&#39; ]</code></pre>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">SELECT
    m.name -- 3. 조건을 만족하는 매니저의 이름을 조회합니다.
FROM
    Employee e -- 1. e는 직원(employee) 테이블입니다.
JOIN
    Employee m ON e.managerId = m.id -- 2. 직원의 managerId와 매니저의 id를 연결합니다. m은 매니저(manager) 테이블입니다.
GROUP BY
    m.id -- 매니저 ID를 기준으로 그룹을 만듭니다. (이름이 같을 수 있으니 id로 하는 것이 더 안전합니다)
HAVING
    COUNT(e.id) &gt;= 5; -- 각 매니저 그룹에 속한 직원 수가 5명 이상인 경우만 필터링합니다.
</code></pre>
<ul>
<li>핵심 로직: 셀프 조인 후, 매니저 아이디로 그룹바이 이후에 직원 아이디를 카운팅 하는 조건 </li>
</ul>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: -</p>
</li>
<li><p>배운 점:
ㄴ TEST 시 긴장 하므로, 이해가 더 안될 확률이 엄청 크다. 테이블로 헷갈리지 않도록 직관적인 별칭을 써야한다.
ㄴ GROUP BY는 꼭 SELECT절에 primary key가 포함된 경우라면, primary key 하나만 써도 무방하며, select 절에 미포함 되도 primary key로 그룹핑 할 수 있다 (유일성)</p>
</li>
</ul>
<p><em>GROUP BY에 쓸 수 있는 컬럼 정리
ㄴ원칙: *</em>SELECT 절의 모든 일반 컬럼은 GROUP BY 절에 포함<strong>되어야 한다.
ㄴ예외 (스마트한 데이터베이스): 하지만 최신 데이터베이스들은 GROUP BY에 **기본 키(Primary Key)</strong>가 포함되면, 그 기본 키에 함수적으로 종속되는 다른 컬럼들은 이미 그룹화된 것으로 간주하여 SELECT 절에 자유롭게 사용할 수 있도록 허용</p>
<p>*예시</p>
<ul>
<li>테이블 구성 : sales_teams, sales_record<h1 id=""><img src="https://velog.velcdn.com/images/dorong_park/post/219bf3ac-72b7-43ce-a942-08d9eb8786fc/image.png" alt=""></h1>
</li>
</ul>
<p>sales_teams</p>
<h1 id="-1"><img src="https://velog.velcdn.com/images/dorong_park/post/3e1c8f14-634c-4b1b-92bd-0f77106fca57/image.png" alt=""></h1>
<p>sales_records</p>
<h1 id="-2"><img src="https://velog.velcdn.com/images/dorong_park/post/84026145-f006-4967-b006-ad1b5e30eb1d/image.png" alt=""></h1>
<p>예시1: 보통의 경우 (select절에 쓰인 모든 컬럼 집계 함수 제외 똑같이 쓰기)</p>
<h1 id="-3"><img src="https://velog.velcdn.com/images/dorong_park/post/f685845e-58ea-44f1-9c8e-75b18446e76b/image.png" alt=""></h1>
<p>예시2: 예외적인 경우 </p>
<h1 id="-4"><img src="https://velog.velcdn.com/images/dorong_park/post/27740845-6161-4e3e-917a-bef9411c7f16/image.png" alt=""></h1>
<p><strong>- primary key가 아닌 다른 컬럼들은 기본 키에 함수적으로 종속되어 있다 판단하여, group by절에서 생략 가능</strong></p>
<ul>
<li>primary key인 team_id에 의해 team_leader_name과 region 결정됨</li>
<li>왜냐하면 team_id가 101이면 팀장 이름은 항상 &#39;김팀장&#39;, 지역은 항상 &#39;수도권&#39;이므로, 여러 값 중에 고민할 필요가 없다는 것</li>
<li>만일 101의 팀장이 변경될 순 있어도, 101 이라는 team_id는 primary key이기 때문에 테이블에 중복해서 나오지 않는 unique한 값(고유성)</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[(웹사이트/실무)SQL 오답노트]]></title>
            <link>https://velog.io/@dorong_park/%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%8B%A4%EB%AC%B4SQL-%EC%98%A4%EB%8B%B5%EB%85%B8%ED%8A%B8</link>
            <guid>https://velog.io/@dorong_park/%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%8B%A4%EB%AC%B4SQL-%EC%98%A4%EB%8B%B5%EB%85%B8%ED%8A%B8</guid>
            <pubDate>Thu, 07 Aug 2025 13:48:49 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐목적">⭐목적:</h3>
<p>해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.</p>
<hr>
<h3 id="❤️오답노트-활용-팁">❤️오답노트 활용 팁</h3>
<ol>
<li><p><strong>원인 분석에 집중하세요</strong>: 정답 코드를 이해하는 것보다 <strong>내가 왜 틀렸는지</strong>를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. &#39;실수했다&#39;에서 그치지 않고 &#39;왜 실수했는지&#39;를 파고들어야 같은 실수를 반복하지 않습니다.</p>
</li>
<li><p><strong>태그를 적극적으로 활용하세요</strong>: <code>#JOIN</code>, <code>#서브쿼리</code>, <code>#날짜함수</code> 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.</p>
</li>
<li><p><strong>주기적으로 다시 풀어보세요</strong>: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.</p>
</li>
</ol>
<h3 id="⭐-오답-노트-template">⭐ 오답 노트 TEMPLATE</h3>
<h3 id="📆-날짜-2025-08-07">📆 날짜: 2025-08-07</h3>
<h3 id="📌-문제-정보">📌 문제 정보</h3>
<ul>
<li><strong>출처 및 번호</strong>: [예: 프로그래머스 SQL 고득점 Kit, Level 3, 문제 이름]</li>
<li><strong>문제 링크</strong>: [문제에 바로 갈 수 있는 링크]</li>
</ul>
<h3 id="📝-문제-요약">📝 문제 요약</h3>
<ul>
<li>[예: &#39;입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회&#39;]</li>
</ul>
<hr>
<h3 id="❌-나의-오답-코드">❌ 나의 오답 코드</h3>
<pre><code class="language-sql">-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
SELECT
    ANIMAL_ID,
    NAME
FROM
    ANIMAL_OUTS O
LEFT JOIN
    ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE
    O.DATETIME IS NOT NULL
ORDER BY
    O.DATETIME - I.DATETIME DESC;
-- LIMIT 2 를 빠트림

🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: &#39;정답이긴 하지만 상위 2개만 출력하라는 조건을 누락함.&#39;]

근본적인 실수: [예: &#39;문제를 꼼꼼히 읽지 않고 ORDER BY 까지만 구현한 뒤 제출함. 요구사항을 끝까지 확인하는 습관이 필요.&#39;]

헷갈렸던 개념: [예: &#39;보호 기간을 계산하기 위해 DATEDIFF를 써야 할지, 단순 뺄셈을 해야 할지 순간적으로 헷갈렸음.&#39;]</code></pre>
<ul>
<li><p>정답 테이블</p>
<h1 id=""><img src="https://velog.velcdn.com/images/dorong_park/post/d839ae04-49a8-42b0-b60e-3de843561b15/image.png" alt=""></h1>
</li>
<li><p>내 쿼리 테이블</p>
<h1 id="-1"><img src="https://velog.velcdn.com/images/dorong_park/post/9e3c0608-929e-4ef7-8517-60b7099f8352/image.png" alt=""></h1>
</li>
</ul>
<h3 id="✅-정답-코드-및-핵심-로직">✅ 정답 코드 및 핵심 로직</h3>
<pre><code class="language-여기에">SELECT
    O.ANIMAL_ID,
    O.NAME
FROM
    ANIMAL_OUTS O
LEFT JOIN
    ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID
ORDER BY
    DATEDIFF(O.DATETIME, I.DATETIME) DESC
LIMIT 2;
</code></pre>
<ul>
<li>핵심 로직: DATEDIFF()로 보호 기간(일수)을 계산하고, ORDER BY ... DESC로 내림차순 정렬한 뒤, LIMIT 2로 상위 2개만 잘라내는 것이 핵심.</li>
</ul>
<h3 id="📚-핵심-개념-및-배운-점">📚 핵심 개념 및 배운 점</h3>
<ul>
<li><p>주요 함수/문법: DATEDIFF(), LIMIT</p>
</li>
<li><p>배운 점:
ㄴMySQL에서 날짜 간의 차이를 &#39;일&#39; 단위로 명확하게 계산하려면 ㄴDATEDIFF(끝나는 날짜, 시작 날짜)를 사용하는 것이 더 안전하고 명시적이다.
ㄴ &#39;상위 N개&#39;, &#39;가장 ~한 N개&#39; 등의 요구사항이 나오면 LIMIT 키워드를 빠트리지 않았는지 반드시 확인해야 한다.</p>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[쿼리(SQL) 잘한다 라는 소리 듣고 싶어서 쓰는 글]]></title>
            <link>https://velog.io/@dorong_park/%EC%BF%BC%EB%A6%ACSQL-%EC%9E%98%ED%95%9C%EB%8B%A4-%EB%9D%BC%EB%8A%94-%EC%86%8C%EB%A6%AC-%EB%93%A3%EA%B3%A0-%EC%8B%B6%EC%96%B4%EC%84%9C-%EC%93%B0%EB%8A%94-%EA%B8%80</link>
            <guid>https://velog.io/@dorong_park/%EC%BF%BC%EB%A6%ACSQL-%EC%9E%98%ED%95%9C%EB%8B%A4-%EB%9D%BC%EB%8A%94-%EC%86%8C%EB%A6%AC-%EB%93%A3%EA%B3%A0-%EC%8B%B6%EC%96%B4%EC%84%9C-%EC%93%B0%EB%8A%94-%EA%B8%80</guid>
            <pubDate>Sun, 27 Jul 2025 16:02:46 GMT</pubDate>
            <description><![CDATA[<p>이번 회사에서 SQL를 쓴지 거의 1년이 다 되어 간다.
사실 데이터 직무로 변경 하기 전에는 전무 했고, 직무 변경 후 첫번째 회사에서는 쿼리를 쓸만한 환경 조차 안되는 협소한 규모의 데이터만 관리 했었다.
그리고 약 2년째 다니는 이 회사에는 회사 규모가 적지 않았기에, 사내에 있는 모든 구성원에게 쿼리를 칠 수 있는 환경이 잘 구축 되어 있었다. (하지만 아날로그를 좋아하는 윗 사람들 때문에, 쿼리에 대해 어느정도 반감을 가진 분위기가 없지 않아 있었음)</p>
<p>이 회사에서는 배울 의지만 있으면 뭐든 할 수 있게끔 도와준다.</p>
<ul>
<li>원하는 데이터의 DB화
ㄴ 생각보다 이 과정이 순탄치만은 않다. (개발 부서를 설득 하는 과정이 필요하다)
ㄴ 본인이 AIRFLOW를 할 수 있으면, 굳이 본사를 통하지 않고 직접 데이터 화 가능</li>
<li>원하는 데이터의 쿼리 구축
ㄴ 쿼리를 못하는데 쿼리가 필요한 상황에 도움 및 테이블 관련 질문 사항 QNA 가능
ㄴ 이 부분에서 내가 치는 쿼리와 개발 부서에서 쳐주는 쿼리가 역시 다르다는 점을 많이 보았고, 잘 치는 사람의 쿼리를 보고 배우는 시간을 꼭 갖었으면 좋겠다 라는 생각을 하게 되었다.</li>
</ul>
<hr>
<p>이직 전 어떻게 회사를 뽑아 먹을 수 있을까?</p>
<ul>
<li><p>1) 쿼리 잘 치는 사람의 쿼리를 베낀다. 
ㄴ 어떤 문법을 주로 쓰는지
ㄴ 어떤 식으로 구성 했는지에 대해 배운다.</p>
</li>
<li><p>2) 내가 쓴 쿼리에 대한 복기를 갖는다
ㄴ 왜 이렇게 생각 한 것인지, 어떤 부분을 더 효율화 할 수 있는지 </p>
</li>
<li><p>3) AIRFLOW 무조건 한번 해본다.
ㄴ 팀 내 데이터를 DB화 할 수 있는 기회를 갖는다.
ㄴ 일일 트리거를 통해서 원하는 데이터를 원하는 곳에 전송 할 수 있는 시스템을 구현한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[조인시 null 값 처리]]></title>
            <link>https://velog.io/@dorong_park/%EC%A1%B0%EC%9D%B8%EC%8B%9C-null-%EA%B0%92-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@dorong_park/%EC%A1%B0%EC%9D%B8%EC%8B%9C-null-%EA%B0%92-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Sun, 20 Jul 2025 05:55:46 GMT</pubDate>
            <description><![CDATA[<ul>
<li>상황:
이동지시서 번호, sku 코드 ,입고일자, 제조일자, 총 수량이 같은 경우에 조인 되게끔 만들었으나,
sku 중에서 제조일자가 없는 경우가 발생 → 이 경우에 조인 시, 입고일자 데이터가 뜨지 않게됨</li>
</ul>
<pre><code>select
    DISTINCT
    YEAR(CAST(MAIN.&quot;출고예정일&quot; AS DATE)) AS &quot;년&quot;,
    MONTH(CAST(MAIN.&quot;출고예정일&quot; AS DATE)) AS &quot;월&quot;,
    WEEK(CAST(MAIN.&quot;출고예정일&quot; AS DATE)) AS &quot;주차&quot;,
    CAST(MAIN.&quot;출고예정일&quot; AS DATE) AS &quot;출고예정일&quot;,
    cast(main.&quot;이동지시서_생성일자&quot; as date) as &quot;이동지시서_생성일자&quot;,
    MAIN.&quot;센터명&quot;,
    MAIN.inventory_transfer_order_id,
    MAIN.SKU_CODE,
    MAIN.sku_nm,
    MAIN.lv3_cate_nm,
    MAIN.lv4_cate_nm,
    CASE 
        WHEN MAIN.&quot;사유구분&quot; =&#39;폐기&#39; THEN MAIN.&quot;상세사유&quot; --- 구분자 변경 전
        ELSE MAIN.&quot;사유구분&quot; --- 변경 후
        END AS &quot;사유구분&quot;,
    CASE 
        WHEN MAIN.&quot;상세사유&quot; LIKE &#39;%선도저하%&#39; THEN MAIN.&quot;비고&quot;
        ELSE MAIN.&quot;상세사유&quot;
        END AS &quot;상세사유&quot;,
    MAIN.&quot;소비기한&quot;,
    MAIN.&quot;제조일자&quot;,
    cast(R.&quot;입고일자&quot; as date) as &quot;입고일자&quot;,
    CASE 
        WHEN MAIN.&quot;총수량&quot; =0 THEN 0
        WHEN ABS(R.&quot;입고량&quot;) IS NULL THEN MAIN.&quot;총수량&quot; 
        ELSE ABS(R.&quot;입고량&quot;) 
        END AS &quot;폐기수량&quot; --- 제조일자가 NULL값인 경우 입고량이 뜨질 않음
from
    MAIN 
    left join RECEVING R ON R.inventory_transfer_order_id = MAIN.inventory_transfer_order_id 
    AND R.SKU =MAIN.SKU_CODE 
    AND cast(R.&quot;소비기한&quot; as date) = MAIN.&quot;소비기한&quot; 
   AND (
   (MAIN.&quot;제조일자&quot; IS NULL AND R.&quot;제조일자&quot; IS NULL)
   OR CAST(R.&quot;제조일자&quot; AS DATE) = MAIN.&quot;제조일자&quot;) ------- ★ 제조일자가 null 인 경우 2가지 조건으로 분기
    AND MAIN.&quot;총수량&quot; =R.&quot;입고량&quot;
ORDER BY
    CAST(MAIN.&quot;출고예정일&quot; AS DATE)</code></pre><hr>
<ul>
<li>제조일자 null 인 경우 조인 시 2가지로 분기
1) (MAIN.&quot;제조일자&quot; IS NULL AND R.&quot;제조일자&quot; IS NULL
OR
2) MAIN.&quot;제조일자&quot; = R.&quot;제조일자&quot; )</li>
</ul>
<p><strong>컬럼 기준으로 조인 할 경우, 해당 컬럼의 모든 값이 다 기재가 안되어 있을 수도 있으므로, NULL값임에도 붙여야 되는 케이스도 존재한다.</strong></p>
<p>전 : 제조일자가 없어서, 입고일자가 NULL 값으로 붙어버림
<img src="https://velog.velcdn.com/images/dorong_park/post/dc776cc9-ab80-4edf-9880-ea8fc5220023/image.png" alt=""></p>
<p>후: 제조일자가 없더라도, 입고일자가 그 외의 조건값으로 조인 되어 붙게됨
<img src="https://velog.velcdn.com/images/dorong_park/post/2d1f26b7-447c-46b5-b644-40ec5c59ee0a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[json 형식 데이터 SQL 다루기]]></title>
            <link>https://velog.io/@dorong_park/json-%ED%98%95%EC%8B%9D-%EB%8D%B0%EC%9D%B4%ED%84%B0-SQL-%EB%8B%A4%EB%A3%A8%EA%B8%B0</link>
            <guid>https://velog.io/@dorong_park/json-%ED%98%95%EC%8B%9D-%EB%8D%B0%EC%9D%B4%ED%84%B0-SQL-%EB%8B%A4%EB%A3%A8%EA%B8%B0</guid>
            <pubDate>Wed, 11 Jun 2025 14:07:18 GMT</pubDate>
            <description><![CDATA[<ul>
<li>STR, INT, DATE, TIMESTAMP 속성으로 되어있는 테이블이 아니라 JSON 형식으로 나와있을 때 어떻게 가져오는 가 에 대해서 배웁니다.</li>
</ul>
<p>**JSON 형식이란?</p>
<blockquote>
<p>Javascript Object Notation
 : 인간이 읽고, 쓰기 쉬우며 기게가 파싱하고 생성하기도 쉬운 개방향 <strong>표준 데이터</strong> 교환 <strong>형식</strong></p>
</blockquote>
<ul>
<li>사람이 읽기 쉬움 : 데이터를 직관적으로 이해할 수 있는 구조로 구성</li>
<li>계층적 구조; 데이터를 중첩된 형태로 표현할 수 있어 복잡한 데이터 구조를 나타내기에 용이</li>
<li>널리 사용됨: api, nosql데이터베이스, 설정파일 등 웹 개발의 거의 모든 영역에서 표준으로 사용</li>
</ul>
<p>**JSON 데이터 타입과 구조</p>
<ul>
<li>JSON 객체 형태 예시
{
&quot;name&quot;: &quot;홍길동&quot;,
&quot;age&quot;: 30,
&quot;city&quot;: &quot;서울&quot;
}</li>
</ul>
<blockquote>
<ol>
<li>객체: {} (중괄호)로 표현되며, 이름/값(NAME/VALUE)쌍의 비정렬 컬렉션</li>
</ol>
</blockquote>
<ul>
<li><p>각 쌍은 &quot;이름&quot;: 값 형태로 표현</p>
</li>
<li><p>이름은 항상 문자열(큰따옴표로 묶인)이어야 함</p>
</li>
<li><p>여러 쌍은 쉼표로 구분</p>
</li>
<li><p>JSON 배열 형태 예시
[
&quot;사과&quot;,
&quot;바나나&quot;,
&quot;딸기&quot;
]</p>
</li>
</ul>
<blockquote>
<ol start="2">
<li>배열:[ ] 대괄호로 표현되며, 값들의 순서 있는 리스트</li>
</ol>
</blockquote>
<p>**JSON 정리</p>
<ul>
<li>JSON은 데이터의 표준화된 형식이다</li>
<li>가독성이 높아, 인간이 이해하거나 컴퓨터가 처리하기 용이하다</li>
<li>이름:값으로 이루어져있다.</li>
</ul>
<p>+) PARSING 이란?</p>
<h1 id=""><img src="https://velog.velcdn.com/images/dorong_park/post/c9fdc06d-2b07-4f0a-99bd-62e99a2d3221/image.png" alt=""></h1>
<blockquote>
<ul>
<li>PARSING(파싱) : <strong>복잡한 형태의 데이터를 컴퓨터가 알아듣기 쉽게 정리하는 작업</strong>
EX) JSON 데이터
{&quot;상품명&quot;: &quot;스마트폰&quot;, &quot;가격&quot;: 1000000, &quot;재고&quot;: 50} → 컴퓨터 입장에서는 하나의 긴 문자열이여서 바로 인식할 수 없음. 파싱이라는 과정을 거치면 상품명은 스마트폰, 가격은 100만원, 재고는 50 이라는 데이터를 정리해서 이해할 수 있게 함</li>
</ul>
</blockquote>
<ul>
<li>SQL에서 JSON 형식 파싱하는 쿼리
ㄴ 1단계: data_json 컬럼의 한 행에 &#39;{&quot;상품명&quot;: &quot;스마트폰&quot;, &quot;가격&quot;: 1000000, &quot;재고&quot;: 50}&#39; 이런 문자열이 들어있음
ㄴ 2단계: JSON 파싱 및 데이터 추출 (JSON_EXTRACT 함수 사용)</li>
</ul>
<pre><code>SELECT
    JSON_EXTRACT(data_json, &#39;$.상품명&#39;) AS product_name,
    JSON_EXTRACT(data_json, &#39;$.가격&#39;) AS price,
    JSON_EXTRACT(data_json, &#39;$.재고&#39;) AS stock
FROM
    제품</code></pre><p>결과 값
| product_name | price    | stock |
|--------------|----------|-------|
| 스마트폰     | 1000000  | 50    |</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 오답 노트]]></title>
            <link>https://velog.io/@dorong_park/SQL-%EC%98%A4%EB%8B%B5-%EB%85%B8%ED%8A%B8</link>
            <guid>https://velog.io/@dorong_park/SQL-%EC%98%A4%EB%8B%B5-%EB%85%B8%ED%8A%B8</guid>
            <pubDate>Tue, 01 Apr 2025 09:46:53 GMT</pubDate>
            <description><![CDATA[<h3 id="1-집계-함수--case-when-절--조건-값을-걸면서-그-값에-집계를-하고-싶을때">1. 집계 함수 + CASE WHEN 절 : 조건 값을 걸면서, 그 값에 집계를 하고 싶을때</h3>
<ul>
<li>각 부서별 여자와 남자의 숫자를 구하고 싶을때
  ㅇ 각 부서로 그룹핑
  ㅇ GENDER 별로 나누기 ---&gt; CASE WHEN 절 사용<h1 id=""><img src="https://velog.velcdn.com/images/dorong_park/post/cc507852-5e4c-4c94-868d-90f6121b4af3/image.png" alt=""></h1>
</li>
</ul>
<pre><code>SELECT
    E.department,
    SUM(case when E.gender = &#39;M&#39; THEN 1 ELSE 0 END) AS &quot;MALE_CNT&quot;,
    SUM(case when E.gender =&#39;F&#39; THEN 1 ELSE 0 END) AS &quot;FEMALE_CNT&quot;
FROM
    EMPLOYEE E
GROUP BY
    E.department</code></pre><h1 id="-1"><img src="https://velog.velcdn.com/images/dorong_park/post/a5beab9d-9467-4ef8-b1ca-8901bc4684e9/image.png" alt=""></h1>
<hr>
<h3 id="2-union-함수">2. union 함수</h3>
<blockquote>
<p>union </p>
</blockquote>
<ul>
<li>같은 열을 가지고 있을 경우 아래 + 위 합치는 개념 </li>
<li>SQL에서 두 개 이상의 결과 집합을 결합할 때 사용되며, 기본적으로 두 집합의 <strong>컬럼 수와 순서가</strong> 같아야 합니다</li>
<li><strong>UNION은 컬럼 이름이 달라도 상관없습니다.</strong> 다만, UNION 연산자는 결과로 반환되는 컬럼 이름은 첫 번째 쿼리의 컬럼 이름을 따릅니다.</li>
<li>UNION을 사용할 때 컬럼의** 데이터 형식(예: INT, VARCHAR 등)이 다르면 SQL에서 에러**가 발생할 수 있습니다. 두 쿼리의 동일한 위치에 있는 컬럼들의 데이터 형식이 호환 가능해야 합니다</li>
</ul>
<blockquote>
<ul>
<li>CTE를 활용 하여 UNION을 해야 할 때</li>
</ul>
</blockquote>
<pre><code>WITH EmployeeData AS (
    SELECT employee_id, name, department
    FROM employees
    WHERE department = &#39;Sales&#39;
),
StaffData AS (
    SELECT employee_id, name, department
    FROM staff
    WHERE department = &#39;Sales&#39;
)
SELECT * FROM EmployeeData ----------- CTE 1
UNION
SELECT * FROM StaffData -------------- CTE 2</code></pre><blockquote>
<ul>
<li>UNION과 UNION ALL의 차이점 : UNION과 UNION ALL은 둘 다 두 개 이상의 쿼리 결과를 결합하는 데 사용됩니다. 그러나 그 동작 방식에서 중요한 차이점이 있습니다. 
<em><strong>&quot;중복 제거 여부&quot;</strong></em></li>
</ul>
</blockquote>
<ul>
<li>UNION: 결합된 결과에서 중복된 행을 <strong>제거</strong>합니다. 즉, 동일한 데이터가 여러 번 나타나지 않도록 자동으로 필터링합니다.</li>
<li>UNION <strong>ALL</strong>: 결합된 결과에서 중복을** 제거하지 않고 **모든 행을 그대로 포함합니다. 즉, 두 쿼리에서 동일한 데이터가 여러 번 나올 수 있습니다.</li>
</ul>
<h3 id="3-coalesce--null이-나올-때-원하는-값으로-지정">3. COALESCE : NULL이 나올 때 원하는 값으로 지정</h3>
<blockquote>
<ul>
<li>한 컬럼이 NULL 값일 때 적용</li>
</ul>
</blockquote>
<pre><code>SELECT 
    COALESCE(PHONE_NUMBER,&quot;NO PHONE NUMBER AVAILABLE&quot;)
FROM
    ~</code></pre><h1 id="-2"><img src="https://velog.velcdn.com/images/dorong_park/post/4b2c5a46-ba35-4df9-b0e5-be5b7d625aa0/image.png" alt=""></h1>
<blockquote>
<ul>
<li>여러 컬럼이 NULL 일 때 적용</li>
</ul>
</blockquote>
<pre><code>SELECT
    COALESCE(EMAIL, WORK_EMAIL, PERSONAL_EMAIL, &quot;NO EMAIL PROVIDED&quot;)
    ---- 셋 중 가장 처음의 NULL 값이 아닌 값을 반영</code></pre><h1 id="-3"><img src="https://velog.velcdn.com/images/dorong_park/post/8edef76e-c316-4329-bf4e-1c95b2bc3ef4/image.png" alt=""></h1>
<blockquote>
<ul>
<li>COALESCE 사칙연산</li>
</ul>
</blockquote>
<ul>
<li>TOTAL_INCOME = SALARY + BONUS<pre><code>SELECT
  EMPLOYEE_ID,
  COALESCE(SALARY,0) + COALESCE(BONUS,0) AS &quot;TOTAL_INCOME&quot;
FROM
  EMPLOYEE</code></pre></li>
</ul>
<h1 id="-4"><img src="https://velog.velcdn.com/images/dorong_park/post/e35c9fa7-8582-470c-b3d0-601c3f9ea7c3/image.png" alt=""></h1>
<h3 id="4-laglead-함수">4. LAG/LEAD() 함수</h3>
<blockquote>
<ul>
<li>lag: 현재 행의 이전 행에 있는 값을 가져옴</li>
</ul>
</blockquote>
<ul>
<li>lead: 현재 행의 다음 행에 있는 값을 가져옴<ul>
<li>lag/lead(컬럼이름, 숫자) : 해당 컬럼의 몇번 쨰 이전/다음의 행을 가져올 지 지정하는 값</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2. 데이터 분석가 공고 분석(경력 3년 이상)]]></title>
            <link>https://velog.io/@dorong_park/2.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B0%80-%EA%B3%B5%EA%B3%A0-%EB%B6%84%EC%84%9D%EA%B2%BD%EB%A0%A5-3%EB%85%84-%EC%9D%B4%EC%83%81</link>
            <guid>https://velog.io/@dorong_park/2.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B0%80-%EA%B3%B5%EA%B3%A0-%EB%B6%84%EC%84%9D%EA%B2%BD%EB%A0%A5-3%EB%85%84-%EC%9D%B4%EC%83%81</guid>
            <pubDate>Mon, 16 Dec 2024 03:46:11 GMT</pubDate>
            <description><![CDATA[<ul>
<li>공고를 통해 앞으로 어떤 역량에 집중해야 하는 가를 확인한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 분석가 역량]]></title>
            <link>https://velog.io/@dorong_park/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B0%80-%EC%97%AD%EB%9F%89</link>
            <guid>https://velog.io/@dorong_park/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B0%80-%EC%97%AD%EB%9F%89</guid>
            <pubDate>Mon, 16 Dec 2024 03:43:56 GMT</pubDate>
            <description><![CDATA[<p>목차</p>
<p>1) 데이터 분석가의 사전적 의미와, 현실적으로 내가 경험한 데이터 분석가의 역할
2) 데이터 분석가로 성장하기 위한 역량 (데이터 분석 프로세싱을 중심으로)
3) 2를 채우기 위해서 어떻게 준비해야 하는지</p>
<hr>
<h3 id="1-데이터-분석가란">1) 데이터 분석가란?</h3>
<blockquote>
<p>사전적 의미: 데이터 분석가(Data Analyst)는 주로 기업이나 정부 기관, 연구소 등에서 일하며, 데이터를 분석하여 이해하기 쉬운 형태로 보고서나 시각화 자료 등을 만들어 의사결정을 지원</p>
</blockquote>
<p>현실적으로 내가 경험한 데이터 분석가가 할 수 있는일....</p>
<blockquote>
<p>*<em>① 의사 결정을 하는 것이 아니라, 의사 결정에 도움이 되는 데이터를 제공한다. 즉, 문제 해결을 위한 답을 제시한다. *</em></p>
</blockquote>
<ul>
<li>보고서 작성을 위해 주체적인 미션 목적 파악, 현황파악, 팀의 스탠스에 맞춰 어떤식으로 이야기 할 것인 가에 대한 프레임 워크 작성</li>
<li>필요한 역량 : 미션의 목적에 대한 정확한 이해, 어떤 식으로 설득할 것인지에 대한 프레임 작성 능력 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 데이터 판별 및 조작 능력 
SQL 보고서 부분 참고 필요!!!!</li>
</ul>
<blockquote>
<p>**  ② 팀내 데이터를 효율적으로 확인 할 수 있는 환경에 도움을 준다. **</p>
</blockquote>
<ul>
<li>지표 실시간 확인(대시 보드 구축)</li>
<li>효율적인 데이터 관리르 위한 데이터 적재 환경 구축(엔지니어와 경계 모호)</li>
<li>필요한 역량: 대시보드 구성력(어떤 식으로 시각화 하여 어떻게 보여줄 것인가에 대한 구성력), 구성을 하기 위한 코딩 기술, DB에 적재 하기 위한 AIRFLOW 활용 능력</li>
</ul>
<blockquote>
<p><strong>③ 데이터 EDA를 통해서 역으로 문제를 제기 하고, 현황을 보고 및 이를 위한 해결책을 제시한다.</strong> </p>
</blockquote>
<ul>
<li>평소에 데이터를 꾸준히 확인 하여 이런 점을 역으로 제안할 수 도 있다</li>
<li>필요한 역량: 평소 데이터에 대한 관심도, 해당 데이터를 하나하나 뜯어보고 요리저리 씹고 뜯고 하는 끈기, 피봇 테이블 활용 능력</li>
<li>EDA 부분 강의 듣기(제베)</li>
</ul>
<hr>
<h3 id="2-데이터-분석가-역량">2) 데이터 분석가 역량</h3>
<ul>
<li>볼드체: 타 업무와 데이터 분석가를 구별 짓는 역량(두터울수록 진입 장벽이 높음)</li>
<li>이외: 타 업무 사람들도 기를 수 있는 역량 및 데이터 분석가에게 필수적으로 필요한 역량이 아닌 경우 </li>
</ul>
<table>
<thead>
<tr>
<th>역량</th>
<th>정의</th>
<th>필요도</th>
</tr>
</thead>
<tbody><tr>
<td>*<em>통계학 지식  *</em></td>
<td>데이터의 패턴과 관계를 파악하고 유의미한 결과를 도출하기 위한 필수 지식</td>
<td>필수적</td>
</tr>
<tr>
<td>머신러닝 지식</td>
<td>데이터 분석에서 모델링 기법을 활용하여 분류, 예측, 군집화 등을 가능하게 하는 기술</td>
<td>중요</td>
</tr>
<tr>
<td>** 프로그래밍 언어 **</td>
<td>데이터 처리 및 분석을 위한 R, Python 등의 프로그래밍 언어 활용 능력</td>
<td>필수적</td>
</tr>
<tr>
<td>데이터 시각화</td>
<td>분석 결과를 이해하기 쉽게 시각화하여 전달하는 능력</td>
<td>중요</td>
</tr>
<tr>
<td>비즈니스 이해력</td>
<td>데이터 분석 결과를 비즈니스 의사결정에 활용할 수 있는 전략적 사고와 이해력</td>
<td>중요</td>
</tr>
<tr>
<td>*<em>문제 해결 능력 *</em></td>
<td>데이터를 통해 문제를 발견하고 해결책을 제시하는 능력</td>
<td>필수적</td>
</tr>
<tr>
<td>소통 능력</td>
<td>분석 결과를 다른 직군과 공유하고 명확하게 전달할 수 있는 능력</td>
<td>중요</td>
</tr>
<tr>
<td>데이터베이스 관리</td>
<td>데이터를 효율적으로 저장하고 관리할 수 있는 능력</td>
<td>중요</td>
</tr>
</tbody></table>
<hr>
<h3 id="3-무엇을-해야하는가">3) 무엇을 해야하는가?</h3>
<blockquote>
<p> 1) <strong>논리력, 사고력 기르기</strong> :  문제 해결 능력, 프로그래밍 언어 활용 능력, 비지니스 이해력, 소통능력 등 대부분의 역량들은 논리력과 이해력에 기반함 
     -  논리력 기르기 : 추리력 기를 수 있는 책 (추리 소설 등)
    - 논리적 사고 : 비문학 등 문해력을 기를 수 있는 책
    - 의사소통 능력: 소프트 스킬 기르기 (유연하게 대화, 설득하는 방법, 결단력 기르기 등)</p>
</blockquote>
<blockquote>
<p>2)** 분석 자료 많이 훔쳐 보기** : 남들이 어떤 식으로 문제를 해결 하고, 접근 하는지에 대해 살펴 볼 필요가 있음, 논리의 흐름과 보고서 구성력 확인하기</p>
</blockquote>
<ul>
<li>라이더 운영 센터 쪽 위키 훔쳐보기</li>
<li>원택님 위키글 훔쳐보기</li>
</ul>
<blockquote>
<p>3) <strong>프로그래밍 실력 기르기</strong>: SQL 등 꾸준히 한 언어에 대한 폭넓은 이해와 경험치 쌓기</p>
</blockquote>
<ul>
<li>SQL 테스트 사이트 사용</li>
<li>SQL 구축 과정 기재 하여 피드백 하기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[재구매 고객 확인 하는 방법]]></title>
            <link>https://velog.io/@dorong_park/%EC%9E%AC%EA%B5%AC%EB%A7%A4-%EA%B3%A0%EA%B0%9D-%ED%99%95%EC%9D%B8-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@dorong_park/%EC%9E%AC%EA%B5%AC%EB%A7%A4-%EA%B3%A0%EA%B0%9D-%ED%99%95%EC%9D%B8-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sun, 08 Dec 2024 07:29:25 GMT</pubDate>
            <description><![CDATA[<h3 id="재구매-한-고객-cte로-확인-하는-방법">재구매 한 고객 CTE로 확인 하는 방법</h3>
<h4 id="1-재구매한-고객-cte">1) 재구매한 고객 CTE</h4>
<p>SELECT CUSTOMER_ID, COUNT(<em>)
FROM ORDER
GROUP BY CUSTOMOER_ID
HAVING COUNT(</em>) &gt;=2 ----- 재구매한 고객 필터링 (WHERE 조건은 불가능, COUNT(*)는  WHERE 조건에서 먼저 실행 되므로 SELECT절 보다 빠르기 때문)</p>
<p>*<em>2) 메인 쿼리와 LEFT JOIN 시키기 *</em></p>
<p>WITH REORDER AS (
SELECT CUSTOMER_ID, COUNT(<em>)
FROM ORDER
GROUP BY CUSTOMOER_ID
HAVING COUNT(</em>) &gt;=2
)
SELECT O.<em>,
    *</em>CASE WHEN RO.CUSTOMER_ID IS NOT NULL THEN &quot;재구매 고객&quot; END AS &quot;재구매 고객 여부&quot;**
FROM ORDER O
LEFT JOIN REORDER RO ON RO.CUSTOMER_ID = O.CUSTOMER_ID</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(윈도우 함수) 이전(lag)/이후(lead) 값 가져오는 함수 정리]]></title>
            <link>https://velog.io/@dorong_park/%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98-%EC%9D%B4%EC%A0%84lag%EC%9D%B4%ED%9B%84lead-%EA%B0%92-%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dorong_park/%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98-%EC%9D%B4%EC%A0%84lag%EC%9D%B4%ED%9B%84lead-%EA%B0%92-%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 30 Nov 2024 12:57:09 GMT</pubDate>
            <description><![CDATA[<ol>
<li>lag, lead 함수의 정의를 배운다</li>
<li>둘의 차이점과 실제 쿼리 예시에 대해 배운다</li>
</ol>
<hr>
<h2 id="1-lag-lead-함수">1. lag, lead 함수</h2>
<blockquote>
<p>(Window Function) 중 하나로, <strong>현재 행의 이전 또는 다음 행의 값을 가져오는 데 사용</strong>됩니다. 주로 시간 순서가 있는 데이터에서 이전 값이나 다음 값을 참조해야 할 때 유용합니다. 이 두 함수는 <strong>데이터를 시간적, 순차적으로 처리하거나 비교할 때 매우 강력</strong>합니다.</p>
</blockquote>
<p>1)  lag</p>
<blockquote>
<p>LAG() 함수는 <strong>현재 행보다 이전 행의 값을 반환</strong>합니다. 기본적으로는 특정 열에서 이전 행의 데이터를 가져옵니다.</p>
</blockquote>
<ul>
<li><p>형태: LAG(expression, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)</p>
<ul>
<li>expression: 이전 행에서 가져올 열의 이름 또는 계산식</li>
<li>offset: 몇 번째 이전 행을 가져올지 지정하는 값 (기본값은 1, 즉 바로 이전 행)</li>
<li>default_value: 이전 행이 없을 때 반환할 기본 값 (옵션)</li>
<li>PARTITION BY: 데이터를 그룹화할 기준 열 (옵션)</li>
<li>ORDER BY: 순서대로 정렬할 기준 열</li>
</ul>
</li>
<li><p>예시</p>
</li>
</ul>
<pre><code>SELECT 
    employee_id, 
    salary,
    LAG(salary, 1) OVER (ORDER BY month) AS previous_month_salary

FROM employees
ORDER BY month;</code></pre><h1 id=""><img src="https://velog.velcdn.com/images/dorong_park/post/95fa92a7-57e1-4371-80eb-0d8c672c4248/image.png" alt=""></h1>
<p>2)  lead</p>
<blockquote>
<p>LEAD() 함수는 <strong>현재 행보다 다음 행의 값을 반환</strong>합니다. <strong>LAG()</strong>와는 반대로, 다음 행에 대한 정보를 가져옵니다.</p>
</blockquote>
<ul>
<li>형태: LEAD(expression, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)<ul>
<li>expression: 이전 행에서 가져올 열의 이름 또는 계산식</li>
<li>offset: 몇 번째 이전 행을 가져올지 지정하는 값 (기본값은 1, 즉 바로 다음 행)</li>
<li>default_value: 이전 행이 없을 때 반환할 기본 값 (옵션)</li>
<li>PARTITION BY: 데이터를 그룹화할 기준 열 (옵션)</li>
<li>ORDER BY: 순서대로 정렬할 기준 열</li>
</ul>
</li>
</ul>
<ul>
<li>예시</li>
</ul>
<pre><code>select
    employee_id,
    salary,
    lead(salary) over(order by month) as next_month_salary
from
    employee</code></pre><p><img src="https://velog.velcdn.com/images/dorong_park/post/d1e049b9-427b-468a-b3e8-7210d3e9a92f/image.png" alt=""></p>
<hr>
<ul>
<li>예시 2<pre><code>SELECT 
  month, 
  sales, 
  LAG(sales, 1) OVER (ORDER BY month) AS previous_sales,
  LEAD(sales, 1) OVER (ORDER BY month) AS next_sales
FROM sales_data
ORDER BY month;
</code></pre></li>
</ul>
<pre><code>


![](https://velog.velcdn.com/images/dorong_park/post/d0294f86-38b6-44bd-a29f-84829c8a21fc/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[(윈도우 함수) 순위 함수 정리]]></title>
            <link>https://velog.io/@dorong_park/%ED%97%B7%EA%B0%88%EB%A6%AC%EB%8A%94-SQL-%EC%88%9C%EC%9C%84-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dorong_park/%ED%97%B7%EA%B0%88%EB%A6%AC%EB%8A%94-SQL-%EC%88%9C%EC%9C%84-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 30 Nov 2024 12:29:20 GMT</pubDate>
            <description><![CDATA[<ol>
<li>ROW_NUMBER(), RANK(), DENSE_RANK() 의 각각의 특성을 안다.</li>
<li>각 차이점을 암기한다.</li>
</ol>
<hr>
<h2 id="1-sql-순위-함수-종류-3">1. SQL 순위 함수 종류 (3)</h2>
<p>예시 데이터</p>
<h1 id=""><img src="https://velog.velcdn.com/images/dorong_park/post/8d5e7027-316d-418f-a68d-833976879159/image.png" alt=""></h1>
<p>1) RANK() 함수</p>
<blockquote>
<p> <strong>중복된 값이 있으면 순위에 &quot;갭&quot;</strong>이 생깁니다. 예를 들어, 두 학생이 같은 점수를 받으면 그 학생들은 같은 순위를 부여받고, 그 다음 순위는 두 칸이 밀려서 부여됩니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/dorong_park/post/d6a76d1f-cbb3-4d62-b0be-2dd8690d30f1/image.png" alt=""></p>
<p>2) DENSE_RANK() 함수</p>
<blockquote>
<p><strong>중복된 값이 있어도 순위에 갭이 생기지 않습니다.</strong> 즉, 같은 점수의 학생들이 있으면 같은 순위를 부여하지만 <strong>그 다음 순위는 그 바로 다음 순위로 부여됩니다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/dorong_park/post/ebcab709-28e5-46ed-9835-dbff6af12b07/image.png" alt=""></p>
<p>3) ROW_NUMBER()</p>
<blockquote>
<p>** 중복된 값이 있어도 순위에 영향을 주지 않습니다<strong>. 중복 값이 있더라도 순위를 &quot;단순히&quot; 부여하므로,</strong> 항상 고유한 순위를 생성**합니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/dorong_park/post/1d3bc9c8-888b-4de3-b68b-1b7833ba5703/image.png" alt=""></p>
<h2 id="2-차이점-정리">2. 차이점 정리</h2>
<blockquote>
<ul>
<li>RANK : 중복 순위가 있으면, 중복 처리 하고 그 이후의 순위는 갭이 생김</li>
</ul>
</blockquote>
<ul>
<li>DENSE_RANK : 중복 순위가 있으면, 중복 처리 하고 그 이후의 순위는 갭이 없음(촘촘히,DENSE 하게 메김)</li>
<li>ROW_NUMBER: 중복값이 있어도 고유한 순위 부여</li>
</ul>
<table>
<thead>
<tr>
<th>함수</th>
<th>중복 순위 취급 여부</th>
<th>순위 부여 방법</th>
<th>갭 여부</th>
<th>예시 (90점 2명, 80점 2명)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>RANK()</strong></td>
<td><strong>중복 순위 취급</strong></td>
<td><strong>동일 순위 부여 후, 그 뒤 순위 건너뛰기</strong></td>
<td>갭 있음</td>
<td>1, 1, 3, 3, 5</td>
</tr>
<tr>
<td><strong>DENSE_RANK()</strong></td>
<td><strong>중복 순위 취급</strong></td>
<td><strong>동일 순위 부여 후, 순위 연속 부여</strong></td>
<td>갭 없음</td>
<td>1, 1, 2, 2, 3</td>
</tr>
<tr>
<td><strong>ROW_NUMBER()</strong></td>
<td><strong>중복 순위 취급 안함</strong></td>
<td><strong>각 행에 고유 번호 부여</strong></td>
<td>없음</td>
<td>1, 2, 3, 4, 5</td>
</tr>
</tbody></table>
<h2 id="3-sql-구문-예시">3. SQL 구문 예시</h2>
<pre><code>SELECT 
    employee_id,
    salary,
    RANK() OVER (ORDER BY salary DESC) AS salary_rank
    -- DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_rank2
    -- row_number() over (order by salary desc) as salary_rank3
FROM employees;
</code></pre>]]></description>
        </item>
    </channel>
</rss>