<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>쿠키 로그</title>
    <link>https://cookievlog.tistory.com/</link>
    <description>성장하는 쿠키의 모든 로그를 담습니다.
</description>
    <language>ko</language>
    <pubDate>Thu, 16 Jul 2026 15:11:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>성장하는 쿠키의 로그 기록</managingEditor>
    <image>
      <title>쿠키 로그</title>
      <url>https://tistory1.daumcdn.net/tistory/7445282/attach/deea1086c6e743f9aa425cae9b5c5716</url>
      <link>https://cookievlog.tistory.com</link>
    </image>
    <item>
      <title>면접 후기 | 비케이브 -브랜드운영관리 면접 회고</title>
      <link>https://cookievlog.tistory.com/160</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 면접 준비&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;채용 프로세스 (경력) : 서류 - 면접 - 레퍼체크 - 최종합격&lt;/li&gt;
&lt;li&gt;타임라인 : 4/26 서류 제출 &amp;rarr; 5/6 서류 합격 &amp;rarr; 5/12(화) 면접 &amp;rarr; 진행중&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;면접 준비 방향&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비케이브 지원직무는 브랜드 운영 관리 매니저. 직무기술서 기반으로 확인했을때, 데이터 분석 관련 어필보다는&amp;nbsp;&quot;패션MD 실무 경험을 통해 데이터 흐름을 현장 맥락으로 읽고 구조화하는 사람&quot; 으로 포지셔닝하는 게 맞다고 판단함.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;축 1 &amp;mdash; 패션 MD 실무:&lt;/b&gt; 매출&amp;middot;재고&amp;middot;판매 데이터를 숫자가 아니라 패션/커머스 비즈니스 맥락으로 해석 하고 분석 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;축 2 &amp;mdash; 데이터 도구 + AI 자동화:&lt;/b&gt; SQL/BigQuery/Tableau/Apps Script/Claude Code까지 쓸 수 있어서 반복 취합&amp;middot;보고 업무를 자동화하고, 더 깊은 분석에 시간을 쓸 수 있게 만드는 사람. 빠르고 정확한 전사 비교 자료 제작 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기업 조사:&amp;nbsp; DART 기반으로 3개년 실적 흐름을 정리함. 매출은 2024년 3,188억에서 2025년 2,743억으로 역성장, 영업이익은 84% 급락, 재고와 임차료 부담이 동시에 늘어나고 있음&amp;nbsp; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;&amp;rarr;&lt;/span&gt; 효율운영 /이익개선/ 재고소진이 주요이슈겠군..&amp;nbsp; ))&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 글로벌 : 내수 침체 속 글로벌 확장 진행중(대만 법인, 커버낫 광군제 매출 급등 등)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.bcave.co.kr/bbs/board.php?bo_table=sub0302&amp;amp;wr_id=179&amp;amp;page=2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.bcave.co.kr/bbs/board.php?bo_table=sub0302&amp;amp;wr_id=179&amp;amp;page=2&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IT인프라 : 통합 ERP. + 사업부서는 AI 활용도 높지 않을것으로 예상 + 옴니채널 관련 세일즈포스 CRM 360도입 후 활용중.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.salesforce.com/kr/customer-stories/bcave/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.salesforce.com/kr/customer-stories/bcave/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조직개편 현황 &amp;amp; 헤드 정보 : 최근 브랜드 총괄 본부장님 변경( 기존 Lee사업부장님 &amp;amp; LF영업기획 출신이신분) &lt;span style=&quot;background-color: #fcfcfc; color: #9d9d9d; text-align: left;&quot;&gt;&amp;rarr; 전사 실적 비교 분석, 브랜드별 kpi 달성율 모니터링등의 자료빽업이 주요하겠군..)&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.fi.co.kr/main/view.asp?idx=87581&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.fi.co.kr/main/view.asp?idx=87581&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1VwWf/dJMcaictSIR/QwF1xdmOxK2ntDKkyEX7zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1VwWf/dJMcaictSIR/QwF1xdmOxK2ntDKkyEX7zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1VwWf/dJMcaictSIR/QwF1xdmOxK2ntDKkyEX7zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1VwWf%2FdJMcaictSIR%2FQwF1xdmOxK2ntDKkyEX7zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;487&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjUPzC/dJMcafz1QRb/hWL4xSFDKvBOKN3Ku49YE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjUPzC/dJMcafz1QRb/hWL4xSFDKvBOKN3Ku49YE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjUPzC/dJMcafz1QRb/hWL4xSFDKvBOKN3Ku49YE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjUPzC%2FdJMcafz1QRb%2FhWL4xSFDKvBOKN3Ku49YE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;576&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 면접&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접은 약 50분, 팀장님과 1:1로 진행됐다. 신설팀이고, 1:1면접이라 현재 팀 구조와 인프라 상황 주요 업무들을 자세하게 설명해주셨고, 면접대화에서 모든 내용을 잘 들어주시고, 서류를 꼼꼼하게 읽어주신것 같아 인상적이었다. 초반에는 짧은 자기소개와 커리어 전환 사유, 공백기질문으로 시작했고, 중반부터는 본격적인 실무 경험과 이 팀에 합류한다면 자동화를 어디서부터 시작할 것인지까지 등으로 이어졌다. 면접관이 업무 흐름과 자사 인프라 상황을 구체적으로 공유해주셔서 큰 어려움 없이 답변을 할수있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전반적으로 답변은 잘 됐다고 느꼈다. 지원직무에 대한 커리어 방향성이 일치했기 때문에 직무 일관성과 커리어 서사가 흔들리지 않았고, 동일한 패션 도메인이다보니 기획MD 시절의 성과경험들이 면접관에게 잘 전달 되기도 했다. 역질문 또한, 비케이브에 대한 뉴스기사나 정보가 많진 않아서, 진짜 궁금한 내용들 위주로 자연스럽게 질문하면서 풀어갔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. KEEP 포인트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;커리어 전환에 대한 일관성있는 답변.&lt;/b&gt; MD &amp;rarr; BI &amp;rarr; 인하우스라는 흐름이 &quot;정체성 없는 이직&quot;이 아니라 &quot;인하우스 데이터 전문가로써 커리어 목표&quot;를 이루는 과정이라는 부분이 전달됐음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도메인이 일치가 성과경험에 대한 설득력을 높임.&lt;/b&gt; 패션/커머스 도메인이 아닌곳에서는 MD시절의 내 성과경험들에 대한 어필이 어려웠고, 산업과 조직의 구조를 설명하는데어려움이 있었는데, 동일 도메인으로 가니 핵심 위주로 전달할수있었음&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;진짜 궁금한 &lt;/b&gt;&lt;b&gt;역질문의 실효성.&lt;/b&gt; 역질문은 궁금한 것 + 관심도 표현을 자연스럽게 섞는 방식으로 계속 준비할 것. 회사와 나의 fit을 더 정확하게&amp;nbsp; 확인하고, 실제 실무에서 어떤 일을 하는지 세부적으로 파악할수있는 계기가 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;질의응답을 스크립트가 아닌 구조로 정리. &lt;/b&gt;이전에는 논리적이고 정확한 답변이 중요하다고 생각해서 예상 질문들과 답변을 스크립트로 준비했는데, 준비하니까 암기하게 되고, 암기하니까 긴장으로 이어지는 악순환이 있었음. 이번엔 예상 질문에 대한 의도 + 답변 구조만 정리하고 이 흐름을 자연스럽게 이어서 답변하니까 긴장도 덜 되고, 진정성있게 답변할 수있음.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 모든 질문에 무너지지 않고 답했고, 면접관님과도 대화의 흐름이 잘 맞았던 것 같다. 합격 여부와 별개로, 자연스럽게 대화하면서 내가 어떤 사람이고 회사에 어떤 기여를 할 수 있는지를 전달할 수 있었던 좋은 경험이었다. 역시, 이형 말대로 최고의 면접 준비는 실전 면접이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접은 내가 어떤 사람인지를 증명하는 자리이기도 하지만, 동시에 내가 이 환경에서 일하고 싶은지를 확인하는 자리이기도 하다. 이번에 두 개의 면접을 동시에 준비하면서 상반된 회사 상황과 조직 문화를 자연스럽게 비교하게 됐다. 그 과정에서 내가 원하는 환경이 좀 더 선명해졌다. &lt;b&gt;주어진 일을 처리하는 데 그치지 않고, 더 나은 방식을 직접 찾고 바꿔나갈 수 있는 곳. 그리고 그 과정을 같은 방향을 보는 팀원들과 함께 치열하게 고민할 수 있는 조직.&lt;/b&gt; 커리어를 준비하는 과정에서 나에대해 고민하고 알아가는 과정이 좋고, 이번 취준 결과로 내가 다음에 어떤 회사에서 업무를 할지 기대가 된댜..&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고</category>
      <category>데이터분석</category>
      <category>면접회고</category>
      <category>면접후기</category>
      <category>비케이브</category>
      <category>비케이브면접후기</category>
      <category>비케이브후기</category>
      <category>운영관리직무</category>
      <category>운영매니저</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/160</guid>
      <comments>https://cookievlog.tistory.com/160#entry160comment</comments>
      <pubDate>Fri, 29 May 2026 17:44:42 +0900</pubDate>
    </item>
    <item>
      <title>면접 후기 | F&amp;amp;F(에프앤에프) - AX팀 실무 면접 회고</title>
      <link>https://cookievlog.tistory.com/159</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 면접 준비( 네비 잘못찍음 &lt;span&gt; &lt;/span&gt;)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;채용 프로세스(경력기준) :&lt;/b&gt; 서류 - AI 역량 검사 - 1차면접(실무) - 최종 면접 (회장님) -합격&lt;br /&gt;&lt;b&gt;타임라인 :&lt;/b&gt; 3/5 서류 제출 &amp;rarr; 3/18 서류합격&amp;rarr; 3/22 AI 역검 &amp;amp; 자사 이력서 다시 제출 &amp;rarr; 3/27 (1차 대면 면접) &amp;rarr; 1차 탈락&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서류 합격 통보를 받고 1주일간 AI 역검부터 자사이력서도 처음부터 다시 쓰고 JD 주요 기술 학습, 매장 방문등 신입공채를 준비했던 것과 비슷하게 직무 기술서/회사 정보를 기반으로 준비했다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260329_061111514_02.jpg&quot; data-origin-width=&quot;2739&quot; data-origin-height=&quot;3765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bknDSd/dJMcajuSyAx/cdHfJ5nk0AXvDfGJbnUib1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bknDSd/dJMcajuSyAx/cdHfJ5nk0AXvDfGJbnUib1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bknDSd/dJMcajuSyAx/cdHfJ5nk0AXvDfGJbnUib1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbknDSd%2FdJMcajuSyAx%2FcdHfJ5nk0AXvDfGJbnUib1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;470&quot; data-filename=&quot;KakaoTalk_20260329_061111514_02.jpg&quot; data-origin-width=&quot;2739&quot; data-origin-height=&quot;3765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기업/브랜드 리서치부터 시작&lt;/b&gt; 중견급 상장사 이기때문에 정보가 비교적 많았다. DART 공시 기준으로 연결 매출 구조, 영업이익률, 재고자산 규모등 확인하고, 데이터/AI 관련 1년치 최신 뉴스/SNS/AX팀 인터뷰등 확인 했다. 가장 인상깊었던 영업이익률 20%대 유지중인 것(실환가..?) MLB 중국법인이 캐시카우 역할하면서 글로벌 매출 작년 1조 돌파. 국내 매출은 3년 연속 역성장 중. 중국 전개는 홀세일/대리상 구조라 대리상 재고 소진율이 다음 시즌 수주량을 결정하는 선행지표 역할을 한다는 것. 현재 기조가 &quot;양적 팽창&quot;에서 점당 매출 효율화등 &quot;질적 성장&quot;으로 전략 축이 이동 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기술 인프라 공부&lt;/b&gt;&amp;nbsp;Snowflake 웨어하우스로 이관 중이며 자체 대시보드 밀키웨이 개발, 여러 운영 업무 AI 자동화 poc 진행중. 기존에 써왔던 BigQuery와의 아키텍처 차이를 매핑해서, 면접에서 기술 스택 질문이 나왔을 때 &quot;써본 적은 없지만 구조적 차이를 이해하고 있다&quot;고 말할 수 있는 수준까지 준비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude code 기반 플랫폼 크롤링 - Excel 연동&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;JD에 'SNS/EC플랫폼 크롤링'이 포함되어 있었는데, 정식 실무 경험이 없었기 때문에 면접 전에 Claude code pro 구매해서 채널매출이 가장 클것 같은&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;무신사에서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;동적 크롤링을 구현하고, Excel in claude로 가공 및 인사이트 추출 자동화까지 연결했다. (해본 적 없다로 끝내기 싫었음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성수 플래그쉽 매장 방문&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;성수점은 역시&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;외국인 비율이 압도적이었다.&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;( 일본고객들이 꽤 있었는데, 매장직원한테 물어보니 요즘 일본사람들이 많다더라,...)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;옆에 뉴발란스 매장과 비교했을 때 웨이팅할 정도로 트래픽이 있었다. 매장 곳곳의 체험형 VM과 카리나 효과인듯 했다. 모자 SKU가 많다보니 랙 옆에 배치된 핏 가이드도 있었고, 다국어로 작성된 POP들도 보면서 고객 응대가 잘 설계돼 있다고 느꼈다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 성수점처럼 외국인 일회성 트래픽이 많은 매장은 신규 고객 전환보다 입객 시 객단가를 높이는 게 핵심일 텐데, 실제로 15만 원 이상 구매 시 커스텀 자수 증정, 신발 2켤레 이상 구매 시 프로모션 등 객단가를 끌어올리는 구조가 잘 깔려 있었다. 분석가로서 이 프로모션 전후의 객단가 변화를 데이터로 확인하고, A/B 테스트 기반 프로모션 최적화도 해보고 싶다는 생각이 들었다. 또&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;카리나 에디션 라인의 슬릭 파우더 신발을 직접 신어보기도 했는데, 착화감이 좋고 가벼워서 제품력에 놀래서 홀린듯 구매까지 진행했다. 1.5조씩 하는 브랜드의 저력이 느껴져 성장가능성이 기대됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답변은 STAR 기법으로 구조화 + 실무 경험이 없다면 유사 성공경험으로 재생산 가능성 전달&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 면접&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접은 총 25분, 4:1로 진행 됐다(인사팀 2, 본부장/사업부장급1,팀장1),&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧은 자기소개와 공백기/이직사유등 개인적인 질문을 진행 한 후, 바로 도메인 기반 실무 스킬 질문이 이어졌다. 특히, 내 커리어와 연차를 감안하시고(추측..), 직접적인 업무 경험은 없으니 &lt;b&gt;만약&lt;/b&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이 업무를 받으면 어떻게 설계할건지&lt;/b&gt;에 대한 워크플로우 &amp;amp; 스키마 설계 내용을 구체적으로 설명 해보라는 질문들이 대부분이었다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결과적으로는 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;도메인 경력직임에도 불구하고 신입처럼 준비했고, AX팀에 자체에 대한 업무 이해도가 낮았던 터라 방향성을 완전히 잘못 잡은 부분이 탈락의 핵심이었던것 같다. 면접 복기를 하면서, MD 때 매일 보고 분석했던 지표들과 내용들로 충분히 답변가능한 질문들도 있었고, 중간중간 면접관님들이 답변 방향성에 대한 힌트도 많이 주셨는데 맥락을 잘 이해하지 못했고, 끌려만 다녔던 면접이라 더 아쉬움이 남은 면접이었다. 하지만, 동시에 이번 면접을 통해 배우고 얻은것도 많아서 KPT 회고를 통해 다음면접때는 더 좋은 결과를 내보고자 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 104px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;준비한 내용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;실제 면접 내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;주니어 신입&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;주어진 업무를 바로 수행할 수 있는 미들급 경력직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;데이터분석가 관점&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;AX팀 담당자 관점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;나의 경험을 어떻게 구조화 해서 잘 전달하느냐&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;내일 출근하면 이 업무를 어떻게 하겠느냐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #eb5757;&quot; data-token-index=&quot;0&quot;&gt;경험 기반 스토리텔링 (WHY-THINKCING)&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #eb5757;&quot; data-token-index=&quot;0&quot;&gt;도메인 기반 실무 시뮬레이션 &lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;JD 분석 &amp;rarr; 회사/브랜드 리서치 &amp;rarr; 경험정리 &amp;amp; why-thinking 구조화 &amp;rarr; 약점 보완 / 유사 성공경험+인성 답변&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;JD 하드스킬 / 주요 업무 &amp;rarr; &lt;/span&gt;이 상황이 주어지면 어떻게 설계할지 에 대한 실무 시뮬레이션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 면접 회고(KPT)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;KEEP &amp;mdash; 유지할 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 기업&amp;middot;브랜드 기반 비즈니스 분석 및 사전 조사&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기업/브랜드 기반 비즈니스 분석, 데이터 인프라 및 회사 방향성 사전 조사. 덕분에 면접관이 &quot;밀키웨이&quot;, &quot;스노우플레이크&quot;, &quot;네이버 데이터 API&quot;, &quot;비전 모델 라벨링&quot; 같은 키워드를 꺼냈을 때 낯설지 않았음. &lt;b&gt;기업 리서치의 깊이와 방향성은 다음에도 유지할 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 신뢰도 관련 리스크 해소 준비&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공백기, 커리어 전환 사유, 짧은 재직 기간에 대한 질문은 예상대로 나왔고 준비한 대로 답변함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 솔직하고 진정성있게 답변하려는 태도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당황스러운 질문에는 생각할 시간을 요청했고, 모르는 부분은 모른다고 답했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PROBLEM &amp;mdash; 고쳐야 할 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 팀 소개와 후속 질문의 맥락을 답변에 연결하지 못했다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초반에 팀 업무를 구체적으로 소개 해주셨고, 어떤 업무를 할수있는 사람을 찾고있는지 설명해주셨다.이건 사실상 &quot;이 맥락 위에서 대답하라&quot;는 가이드였던것 같다. 리오더 질문에서 &quot;가격보다는 몇 장을 할 건지가 중요하잖아요&quot;라고 직접 답변 방향을 제시해주셨는데, 긴장 때문에 이 힌트를 제대로 활용하지 못하고 기존 답변 흐름을 유지해버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ndash; 경력직 포지션인데 &quot;할 수 있다&quot; 수준으로 답변했다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경력직 면접에서 &quot;해봤습니다 / 할 수 있습니다&quot;는 충분하지 않다&lt;span style=&quot;color: #000000;&quot;&gt;. 경험이 있다면 그 경험을 구조적으로 설명하고, 경험이 없는 영역이라면 &quot;이렇게 설계하겠습니다&quot;로 도메인 역량을 최대치로 보여줘야 한다. 내가 강점으로 내세운 패션 MD 도메인 역량이 실제 답변 과정에서 충분히 발현되지 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;- JD 주요 업무의 하드스킬을 과소 해석했다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JD에 적힌 크롤링, 트렌드/키워드 분석, AI 자동화 로직 설계를 &quot;한번 해봤기 때문에, 빠르게 학습해서 진행할수있다&quot;라고 답변할 수 있게 준비했다. 그런데 해당 부분들이 팀의 핵심 업무였다. &quot;빠른 학습&quot;이 아니라, 도메인 맥락을 반영해서 해당 업무를 직접 설계해본 경험이 있었어야 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;- 패션 MD 실무 경험을 데이터 변수로 번역하는 훈련 부족&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가장 아쉬운 포인트다. 리오더 질문에서 &quot;얼마나 팔릴지 (판매 속도,예상 판매량,채널별 판매비중) 언제까지 팔릴지 (리드타임, 시즌 마감 일수, 판매가능일수,주간이벤트,휴일이슈) 이 바로 나왔어야 하는데, 앞단의 &quot;원가, 현물 확인&quot;이 먼저 나왔다... 나는 기존에 시즌 상품의 어패럴 담당이어서 현물 여부, 원가 상승, 리드타임 를 먼저 확인했고 그 다음이 가능한 부분안에서의 수량 픽스라, MLB처럼 용품(원단문제없음) &amp;amp; 중국/베트남 공장(리드타임 짧음) 인 경우를 디폴트 라고 바로 생&lt;/span&gt;각을 못했다. ( 넥타이/양말 기준으로 리오더 설계 했어야 했음,,,) MD로써의 실무 경험은 있지만, 이걸 데이터 테이블의 컬럼명과 분석 로직으로 즉시 번역하는 능력이 부족했다. 복기해보니 어떤 게 필요한지는 이제 알겠다. 체화가 안 됐을 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 아이디어를 구체화하지 못했다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 알림 시스템을 제안했지만, &quot;알림을 줍니다&quot;에서 멈췄다. 면접관이 원한 건 알림 &amp;rarr; 원인 분해 &amp;rarr; 대응 액션 &amp;rarr; 실행까지의 end-to-end 워크플로우였다. 현업 이슈를 제안하는 것까지는 괜찮았지만, 실제로 어떻게 구현할 것인지까지 구체화하는 역량이 부족했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TRY &amp;mdash; 시도할 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. JD 분석 기반 이력서&amp;middot;면접 준비 방향 전환: &quot;설계 시뮬레이션&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식: JD 키워드 추출 &amp;rarr; 내 경험 중 매칭되는 것을 찾음 &amp;rarr; 스토리텔링으로 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전환할 방식:&lt;/b&gt; JD 키워드 추출 &amp;rarr; &quot;이 업무를 받으면 어떻게 설계하겠는가&quot; 시뮬레이션 &amp;rarr; 설계 로직을 구조화 &amp;rarr; 경험은 설계의 근거로 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 &amp;mdash; EC 플랫폼 크롤링:&lt;/b&gt; &quot;00사에서 경쟁사 데이터 가져와서 분석용 테이블 만들어줘&quot;라고 한다면? &amp;rarr; 수집 전에 테이블 스키마부터 설계한다. &lt;span data-token-index=&quot;0&quot;&gt;상품 정보 마스터 테이블 &lt;/span&gt;: 브랜드명, 카테고리(대중소), 스타일명,제품명, 성별, 색상, 소재, 시즌, 런칭일 (이미지분석 기반 - 소재, 스타일 유형 분류 등) &lt;span data-token-index=&quot;0&quot;&gt;가격 &amp;amp; 할인 : 플랫폼 ,&lt;/span&gt;정가, 판매가, 할인율, 할인 종류 - 상시, 타임딜인지 등, &lt;span data-token-index=&quot;0&quot;&gt;판매 반응 : 리뷰수, 평점, 카테고리내 순위, 품절여부 (판매량 대리 지표 가능)&lt;/span&gt; +&lt;span data-token-index=&quot;0&quot;&gt;&amp;nbsp;조인 : 우리 마스터 테이블의 카테고리 체계를 재정의 하고 맵핑 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 &amp;mdash; 자동화 파이프라인:&lt;/b&gt; &quot;주간 매출 리포트를 월요일마다 자동으로 배포해줘&quot;라고 한다면? &amp;rarr; 데이터 소스(DB에서 주간 매출 추출) &amp;rarr; 집계 로직(카테고리별&amp;middot;채널별 매출, WoW/YoY 산출) &amp;rarr; 이상 감지(목표 대비 00% 미만 SKU 자동 플래그) &amp;rarr; AI 요약(원인 분해 텍스트 자동 생성) &amp;rarr; 시각화 + 배포. 각 단계별 사용 도구와 로직까지 명시할 수 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 면접 답변 구조 전환: 설계 70% + 경험 근거 30%&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 경험 80% + 설계 20%였다. 다음부터는 뒤집자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연습방법&lt;/b&gt;&lt;b&gt;:&lt;/b&gt; &quot;이 업무를 받으면 이렇게 설계하겠습니다&quot; &amp;rarr; &quot;이렇게 판단한 근거는 MD 시절 이런 경험이 있기 때문&quot; 경험이 없는 영역이라면, 설계 시뮬레이션을 먼저 보여주고 유사 경험으로 근거를 댄다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 면접관의 팀 소개 &amp;amp; 후속 질문 맥락을 답변에 연결시키는 연습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접관이 소개를 할 때 핵심 키워드를 기억한 후 답변에서 면접관의 언어를 빌려서 답하는 습관을 들인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연습 방법:&lt;/b&gt; &quot;말씀하신 경쟁사 프로모션 분석 하는 상황이라면 promotion_type 컬럼이 필수적이고&amp;hellip;&quot;처럼 바로 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후속 질문에서 면접관이 힌트를 줬을 때(&quot;가격보다는 몇 장이 중요하잖아요&quot;), 그 방향으로 바로 피벗하는 연습도 함께 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. 하드스킬: 개인 프로젝트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트 ① 경쟁사 모니터링 시스템 &amp;mdash; 크롤링 + 수집 테이블 설계 + 자사 스키마 기반 매핑&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트 ② API 기반 트렌드/키워드 분석 자동화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트 ③ 주간 리오더 알림 시스템 시뮬레이션 &amp;mdash; 리오더 필요 상품 판단 &amp;amp; 알림 - AI 예측 분석(시점별 리오더수량) - 대응 제안&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 면접을 통해 배운건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 강점을 가진 경력직임을 어필하기 위해 &quot;해봤습니다&quot;가 수준을 넘어, &quot;이렇게 설계하겠습니다 + 유사 경험 어필&quot;과 같이 비즈니스 맥락을 반영한 설계력과 근거 경험이 필요하다, 또한, 면접은 서로의 fit을 확인하면서, 궁금증을 해소하기 위한 대화고-- 대화에서 가장 중요한건 맥락이다. 준비한 내용을 바탕으로 하되, 대화의 맥락을 파악하기 위해 집중해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 빠르게 발전하면서, '레거시 분석가'의 채용폭은 점점 좁아지고 있고, 주니어 분석가/신입분석가들에게 요구되는 역량과 범위가 더욱 넓어지고 있음을 채용준비 과정에서 매일 체감하고 있다. 실무진들이 너도나도 AI를 활용하고 비개발직군도 바이브코딩으로 쉽게 서비스를 만들고 있다. 이런 흐름속에서 내가 가진 강점이 뭐고, 어떤 방향성으로 커리어를 가져갈지 전략적인 고민이 필요할것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AX분석가/담당 직무는 도메인을 이해하는 사람이 &quot;뭘 자동화해야 하는지&quot;를 정의하고, 그 구조를 직접 설계하고 구현까지 연결하는 사람이다.&lt;/b&gt;&amp;nbsp;분석의 주체가 사람에서 시스템으로 이동하는 흐름 속에서, &lt;b&gt;분석가의 가치는 &quot;분석을 하는 것&quot;이 아니라 &quot;분석이 돌아가는 구조를 만드는 것&quot; 에 있다는데 공감을 하면서 앞으로 분석가의 역할범위가 어떻게 변화할지 지켜봐야할것 같다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CLAUDE SKILLS.jpg&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjxBbH/dJMcahX9ChG/g08vznbci5Yy0SemaYYpUK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjxBbH/dJMcahX9ChG/g08vznbci5Yy0SemaYYpUK/img.jpg&quot; data-alt=&quot;고생한 내 클로드..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjxBbH/dJMcahX9ChG/g08vznbci5Yy0SemaYYpUK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjxBbH%2FdJMcahX9ChG%2Fg08vznbci5Yy0SemaYYpUK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;519&quot; data-filename=&quot;CLAUDE SKILLS.jpg&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;고생한 내 클로드..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고</category>
      <category>AX분석가</category>
      <category>AX팀</category>
      <category>KPT회고</category>
      <category>데이터분석가</category>
      <category>면접후기</category>
      <category>에프앤에프면접</category>
      <category>에프앤에프면접후기</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/159</guid>
      <comments>https://cookievlog.tistory.com/159#entry159comment</comments>
      <pubDate>Sun, 29 Mar 2026 06:18:16 +0900</pubDate>
    </item>
    <item>
      <title>TIL | 태블로 구현( 매개변수 &amp;amp; 테이블 계산, 100% 누적 막대 그래프, 3개이상 다중필드 이중축)</title>
      <link>https://cookievlog.tistory.com/157</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; &lt;span&gt; Intro&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;입사한 지 일주일이 지났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;전주에는 태블로 기초와 중급 수준의 교육을 받았고, 이번주는 퀴즈 풀이를 통해 배운부분을 반복적으로 익히는 주간이 될 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; &lt;span&gt; ️&lt;/span&gt; Tableau &lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 범주형 매개변수(필드) &amp;amp; 조건 계산된 필드로 필터링 하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건 ) 선택한 범주별(매개변수) 하위범주의 매출 막대그래프로 시각화(계산된 필드) &amp;amp; 그 외의 범주는 범주 계로 나타내기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC6Ovr/btsOCg8zjmu/jeClCvRmmv3uh71LK6peWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC6Ovr/btsOCg8zjmu/jeClCvRmmv3uh71LK6peWK/img.png&quot; data-alt=&quot;최종 구현해야하는 시각화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC6Ovr/btsOCg8zjmu/jeClCvRmmv3uh71LK6peWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC6Ovr%2FbtsOCg8zjmu%2FjeClCvRmmv3uh71LK6peWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1098&quot; height=&quot;593&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최종 구현해야하는 시각화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근 ) 매개변수 생성 -&amp;gt; 조건문 계산된 필드 생성 -&amp;gt; 마크 레이블 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.`&lt;/b&gt;p_범주구분` 매개변수 생성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`범주`필드의 측정값 매핑해주고 (ex. 가구 - 가구 등)&lt;/li&gt;
&lt;li&gt;전체 조건 추가&amp;nbsp; (ex. 전체 - 전체)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b994BI/btsOCmHZgKW/l6NbVrrKbUHdFBEQkl1ky0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b994BI/btsOCmHZgKW/l6NbVrrKbUHdFBEQkl1ky0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b994BI/btsOCmHZgKW/l6NbVrrKbUHdFBEQkl1ky0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb994BI%2FbtsOCmHZgKW%2Fl6NbVrrKbUHdFBEQkl1ky0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;843&quot; height=&quot;726&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.`&lt;/b&gt;c_범주구분` 조건문 계산된 필드 생성 (IF ~ ELSE ~ END)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lsquo;전체&amp;rsquo; 선택 : 하위 범주 전체 표시 -&amp;gt; 매개변수가 '전체' 일때 하위범주 가져오기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;lsquo;특정값(범주)&amp;rsquo; 선택 : 범주의 하위 범주 표시 -&amp;gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;매개변수가 '범주' 일때 하위범주 가져오기&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;그 외의 값은 범주명&amp;amp; 매출계 표시 -&amp;gt; 그 외에는 범주명만 가져오기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7X59/btsODMMa2s1/SFavtjJB53GZNR1hp2ad20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7X59/btsODMMa2s1/SFavtjJB53GZNR1hp2ad20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7X59/btsODMMa2s1/SFavtjJB53GZNR1hp2ad20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7X59%2FbtsODMMa2s1%2FSFavtjJB53GZNR1hp2ad20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;801&quot; height=&quot;166&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1750084581248&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IF ([P_범주구분] ='전체' or [P_범주구분] = [범주]) THEN [하위 범주]
ELSE [범주]
END&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 색상 카드 범례 추가 하기&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 분석 탭 -&amp;gt; 범례 -&amp;gt; 원하는 필드 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG4uht/btsODn6YaeH/IOekopvrCyt4xdeWRCD0k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG4uht/btsODn6YaeH/IOekopvrCyt4xdeWRCD0k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG4uht/btsODn6YaeH/IOekopvrCyt4xdeWRCD0k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG4uht%2FbtsODn6YaeH%2FIOekopvrCyt4xdeWRCD0k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;654&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 범주의 월별 매출 합계가 100% 인 누적 막대 그래프 시각화&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7cSTq/btsOEzZGm38/6Zb0bDVKnPHOL7ckk4NWK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7cSTq/btsOEzZGm38/6Zb0bDVKnPHOL7ckk4NWK0/img.png&quot; data-alt=&quot;최종 구현해야하는 시각화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7cSTq/btsOEzZGm38/6Zb0bDVKnPHOL7ckk4NWK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7cSTq%2FbtsOEzZGm38%2F6Zb0bDVKnPHOL7ckk4NWK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1502&quot; height=&quot;1027&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최종 구현해야하는 시각화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 월별 매출액 막대 그래프 생성 ( 열선반- 주문날짜 / 행선반- 매출)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 범주 필드 색상 마크 추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3. 행선반의 `매출` 필드 테이블 계산 (계산대상 : 셀 , 퀵 테이블 계산 : 구성비)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계산 대상 '셀' :&amp;nbsp; 셀단위 '월'의 범주의 구성비니까&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/STMfA/btsOEP2uCTU/uLJyILsdrKZIOBRgHdM4w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/STMfA/btsOEP2uCTU/uLJyILsdrKZIOBRgHdM4w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/STMfA/btsOEP2uCTU/uLJyILsdrKZIOBRgHdM4w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSTMfA%2FbtsOEP2uCTU%2FuLJyILsdrKZIOBRgHdM4w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;827&quot; height=&quot;830&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 다중 측정값(총 4개)&amp;nbsp; 2개씩 그룹핑 하여 이중축 설정 하기 ( 좌 / 우)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF8a6T/btsODIwyW6F/ZbIfIwGupN7J5nQxPwV171/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF8a6T/btsODIwyW6F/ZbIfIwGupN7J5nQxPwV171/img.png&quot; data-alt=&quot;최종 구현할 이중축 시각화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF8a6T/btsODIwyW6F/ZbIfIwGupN7J5nQxPwV171/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF8a6T%2FbtsODIwyW6F%2FZbIfIwGupN7J5nQxPwV171%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2193&quot; height=&quot;1334&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최종 구현할 이중축 시각화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D) 주차별 유가 데이터 추이를 한 화면에 구현하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근) 측정값 -&amp;gt; 피벗 후 조건문 사용하여 값 그룹핑, 이중축 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 데이터 원본 -&amp;gt; 피벗 ; 구현하고자 하는 4개의 측정값(컬럼)을 1개의 컬럼으로('유가종류','유가') &lt;span data-token-index=&quot;1&quot;&gt;피벗&lt;/span&gt;(열 &amp;rarr;행)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XFXu4/btsOCfBOkiM/k3BOlsLDyWYdB11Re9C7UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XFXu4/btsOCfBOkiM/k3BOlsLDyWYdB11Re9C7UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XFXu4/btsOCfBOkiM/k3BOlsLDyWYdB11Re9C7UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXFXu4%2FbtsOCfBOkiM%2Fk3BOlsLDyWYdB11Re9C7UK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;230&quot; height=&quot;314&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 측정값을 &lt;b&gt;100 기준으로 100언더/ 100오버 2개 조건식 필드 생성후 행 선반에 올림 &amp;rarr; 색상구분&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;100언더 필드 : 좌측 축으로 설정 하기 위함&lt;/li&gt;
&lt;li&gt;100오버필드 : 우측 축으로 설정 하기 위함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1750085411070&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 계산된 필드 : [C_100언더]

if [유가] &amp;lt;100 then [유가]
else null
END

2. 계산된 필드 : [C_100오버]

if [유가] &amp;gt;=100 then [유가]
else null
END&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이중축 설정&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSQoUX/btsODFT8xMf/sfj4ip5tZ7fWZOJ1Cbi0kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSQoUX/btsODFT8xMf/sfj4ip5tZ7fWZOJ1Cbi0kk/img.png&quot; data-alt=&quot;4.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSQoUX/btsODFT8xMf/sfj4ip5tZ7fWZOJ1Cbi0kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSQoUX%2FbtsODFT8xMf%2Fsfj4ip5tZ7fWZOJ1Cbi0kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;189&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 색상카드 컬러 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 지도 맵 &amp;amp; 파이 차트 이중축 설정하기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2253&quot; data-origin-height=&quot;1273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djDXFe/btsOCDpcF7p/qrTS4G2O58aL0YHVyRikxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djDXFe/btsOCDpcF7p/qrTS4G2O58aL0YHVyRikxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djDXFe/btsOCDpcF7p/qrTS4G2O58aL0YHVyRikxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjDXFe%2FbtsOCDpcF7p%2FqrTS4G2O58aL0YHVyRikxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2253&quot; height=&quot;1273&quot; data-origin-width=&quot;2253&quot; data-origin-height=&quot;1273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 열 선반에 경도 1개더 추가 &amp;amp; 이중축&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>TABLEAU</category>
      <category>100%누적막대</category>
      <category>Tableau</category>
      <category>매개변수</category>
      <category>이중축</category>
      <category>태블로</category>
      <category>테이블계산</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/157</guid>
      <comments>https://cookievlog.tistory.com/157#entry157comment</comments>
      <pubDate>Mon, 16 Jun 2025 23:57:32 +0900</pubDate>
    </item>
    <item>
      <title>QCC | 7회차 코드 리뷰 &amp;amp; 피드백 (+마지막 qcc)</title>
      <link>https://cookievlog.tistory.com/155</link>
      <description>&lt;h3 id=&quot;%E2%98%91%EF%B8%8F%EB%AC%B8%EC%A0%9C5)%20%EA%B3%A0%EA%B0%9D%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B4%80%EB%A6%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C-1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp; 좋아요를 받지않은 페이지 조회&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BQlsN/btsMQF3gG3p/BkCiI9ZN4sQd9coXN5WxbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BQlsN/btsMQF3gG3p/BkCiI9ZN4sQd9coXN5WxbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BQlsN/btsMQF3gG3p/BkCiI9ZN4sQd9coXN5WxbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBQlsN%2FbtsMQF3gG3p%2FBkCiI9ZN4sQd9coXN5WxbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;543&quot; height=&quot;459&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT DISTINCT p.page_id AS page_id
FROM pages p 
	LEFT JOIN page_likes pl ON p.page_id =pl.page_id
WHERE pl.page_id IS NULL
ORDER BY 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;left join 후 null 값 집계 하는 문제&lt;/li&gt;
&lt;li&gt;page_id 만 출력하는 부분에서, group by 쓸지 distinct 쓸지 고민하다가 한줄 추가하기 싫어서 distinct로 해결&lt;/li&gt;
&lt;li&gt;실무에서 사용한다면 group by 가 더 적합할듯&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;pass&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;%E2%98%91%EF%B8%8F%EB%AC%B8%EC%A0%9C5)%20%EA%B3%A0%EA%B0%9D%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B4%80%EB%A6%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C-1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp; 티커별 최고가/최저가와 해당날짜 조회하기&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1FkQU/btsMQTNRCtJ/NeYV8Wws5tIwnhkgz4D75k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1FkQU/btsMQTNRCtJ/NeYV8Wws5tIwnhkgz4D75k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1FkQU/btsMQTNRCtJ/NeYV8Wws5tIwnhkgz4D75k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1FkQU%2FbtsMQTNRCtJ%2FNeYV8Wws5tIwnhkgz4D75k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;551&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. high /low 의 open 과 일짜 각각cte로 만들어서 join 해주기 -&amp;gt; high/low값 각각집계해서 최적화 필요
WITH high_t AS(
	SELECT date,ticker,open
		  ,DENSE_RANK () OVER (PARTITION BY ticker ORDER BY open DESC) AS high
	FROM stock_prices
	WHERE OPEN IS NOT NULL
), low_t AS(
	SELECT date,ticker,open
		  ,DENSE_RANK () OVER (PARTITION BY ticker ORDER BY open asc) AS low
	FROM stock_prices
	WHERE OPEN IS NOT NULL
), high_t2 AS(
SELECT ticker
	 ,DATE_FORMAT(date,'%Y%m') AS highest_mth
	 ,OPEN AS highest_open
FROM high_t
WHERE high=1
), low_t2 AS(
SELECT ticker
	 ,DATE_FORMAT(date,'%Y%m') AS lowest_mth
	 ,OPEN AS lowest_open
FROM low_t
WHERE low=1
)
SELECT h.ticker,highest_mth,highest_open,lowest_mth,lowest_open
FROM high_t2 h
	INNER JOIN low_t2 l ON h.ticker =l.ticker
ORDER BY ticker;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내코드2 (high /low 각 테이블에서 구한 후 집계하기)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742534165298&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- WHERE 절 다중컬럼 서브쿼리 활용해서 HIGH/LOW CTE 각각 만들어서 해결 
WITH high AS (
	SELECT ticker,DATE_FORMAT(date,'%Y%m') AS highest_mnth,OPEN AS highest_open
	FROM stock_prices
	WHERE (ticker,open) IN (SELECT ticker,MAX(OPEN) FROM stock_prices GROUP BY ticker)
	 AND OPEN IS NOT null
),low AS (
	SELECT ticker,DATE_FORMAT(date,'%Y%m') AS lowest_mnth,OPEN AS lowest_open
	FROM stock_prices
	WHERE (ticker,open) IN (SELECT ticker,MIN(OPEN) FROM stock_prices GROUP BY ticker)
	AND OPEN IS NOT null
)
SELECT h.ticker,highest_mnth,highest_open,lowest_mnth,lowest_open
FROM high h 
	INNER JOIN low l ON h.ticker=l.ticker 
ORDER BY 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최종 최적화 쿼리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735134967560&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 순서 부여 CTE 만든후, CASE WHEN 조건으로 피벗팅 
WITH rank_t AS(
	SELECT DATE_FORMAT(date,'%Y%m') AS dt,ticker,open
		  ,DENSE_RANK () OVER (PARTITION BY ticker ORDER BY open DESC) AS high
		  ,DENSE_RANK () OVER (PARTITION BY ticker ORDER BY open ASC) AS low
	FROM stock_prices
	WHERE OPEN IS NOT NULL
)
SELECT ticker
        ,MAX(CASE WHEN high =1 THEN dt END) AS highest_mnth
        ,MAX(CASE WHEN high =1 THEN open END) AS highest_open
        ,MAX(CASE WHEN low =1 THEN dt END) AS lowest_mnth
        ,MAX(CASE WHEN low =1 THEN open END) AS lowest_open
FROM rank_t
GROUP BY ticker
ORDER BY ticker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;문제 ) 최고가 /최저가 값만 추출하는게 아니라, 그 값의 날짜까지 같이 추출해주어야함&amp;nbsp;&lt;/li&gt;
&lt;li&gt;코드1 ) 최고가/최고가일자/최저가/최저가일자 각각 4개의 cte 만들어서 최종 아우터쿼리에서 join&lt;/li&gt;
&lt;li&gt;코드2 ) 최고가&amp;amp;최고가일자 / 최저가&amp;amp;최저가일자 각각 cte로 생성 ( 값 - 일자를 가져오기 위해 다중컬럼 서브쿼리 활용)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;쿼리는 짧아졌으나, 다중컬럼 서브쿼리는 리소스가 많이 듦&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;코드3 - 최적화) 최고가/최저가를 각각 넘버링 해준후 아우터쿼리에서 피벗팅 &amp;amp; 그룹화 뽑아줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;pass&amp;nbsp;&lt;/li&gt;
&lt;li&gt;값 - 해당 날짜를 여러개 조회해야하는경우 넘버링 &amp;amp; 피벗팅+ 그룹바이 활용!!!!!!!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;%E2%98%91%EF%B8%8F%EB%AC%B8%EC%A0%9C5)%20%EA%B3%A0%EA%B0%9D%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B4%80%EB%A6%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C-1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp; 모든 서버의 총 실행시간 집계하기&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cecyuK/btsMS8CFzZf/s2zEtma79Nh8CWDI3OU3zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cecyuK/btsMS8CFzZf/s2zEtma79Nh8CWDI3OU3zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cecyuK/btsMS8CFzZf/s2zEtma79Nh8CWDI3OU3zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcecyuK%2FbtsMS8CFzZf%2Fs2zEtma79Nh8CWDI3OU3zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;683&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 -&amp;gt; 오답&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WITH organized AS( -- 혹시 몰라 정렬 &amp;amp; 단독이벤트 제외
	SELECT *
	FROM server_utilization s1
	WHERE server_id IN (SELECT server_id FROM server_utilization GROUP BY server_id HAVING COUNT(DISTINCT session_status) =2)
	ORDER BY server_id,status_time
), time_t AS (
SELECT server_id,session_status
	  ,status_time AS start_time
	  ,LEAD(status_time) OVER(PARTITION BY server_id) AS stop_time
FROM organized
), time_diff AS(
SELECT *
	  ,FLOOR(TIMESTAMPDIFF(SECOND,START_time,stop_time)/86400) AS diff
FROM time_t
WHERE session_status= 'start'
)
SELECT SUM(diff) AS total_uptime_days
FROM time_diff;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수정 코드&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735134967560&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WITH organized AS( -- 혹시 몰라 정렬 &amp;amp; 단독이벤트 제외
	SELECT *
	FROM server_utilization s1
	WHERE server_id IN (SELECT server_id FROM server_utilization GROUP BY server_id HAVING COUNT(DISTINCT session_status) =2)
	ORDER BY server_id,status_time
), time_t AS (
SELECT server_id,session_status
	  ,status_time AS start_time
	  ,LEAD(status_time) OVER(PARTITION BY server_id) AS stop_time
FROM organized
), time_diff AS(
SELECT *
	  ,TIMESTAMPDIFF(SECOND,START_time,stop_time)/86400 AS diff
FROM time_t
WHERE session_status= 'start'
)
SELECT FLOOR(SUM(diff)) AS total_uptime_days
FROM time_diff;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정답 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1742535113468&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WITH running_time AS (
	SELECT *
		, LEAD(status_time) OVER (PARTITION BY server_id ORDER BY status_time) next_status_time
		, LEAD(session_status) OVER (PARTITION BY server_id ORDER BY status_time) next_session_status
	FROM server_utilization
), server_uptime_second AS (
	SELECT server_id
		, FLOOR(SUM(TIMESTAMPDIFF(SECOND, status_time, next_status_time) / 86400)) uptime_days 
	FROM running_time 
	WHERE session_status = 'start'
	AND next_session_status = 'stop'
	GROUP BY 1
)
SELECT SUM(uptime_days) AS total_uptime_days
FROM server_uptime_second;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;오답 이유 : 내림 순서 오류
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;일자로 변경 후 -&amp;gt; 합집계 -&amp;gt; 소수점 내림 해야함&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FAIL&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;행단위로 시작- 끝 시각 저장되어있는 경우,
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;끝시각 LEAD로 가져온후 -&amp;gt; 원본 시작시각 &amp;amp; LEAD 끝시각 필터링 -&amp;gt; TIMESTAMPDIFF -&amp;gt; 합 집계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;nbsp;전체 QCC&amp;nbsp; 회고 (1-7회차)&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 QCC 까지 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QCC 진행하면서 느낀점은 문제의 디테일/ 쿼리의 디테일을 자꾸 놓친다는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 문제에서 소수점 내림차를 먼저 해버린다거나, 6회차에서 숫자1을 문자 1로 타입을 잘못 출력한다거나..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론은, 실무에서도 디테일을 놓치면 전체 값이 크게 틀어지는 경우가 있으니 조건을 잘 파악하고&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt; 놓치지 않는 연습이 더 필요하겠다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>SQL</category>
      <category>qcc</category>
      <category>SQL</category>
      <category>sql코딩테스트</category>
      <category>라이브코테</category>
      <category>코테준비</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/155</guid>
      <comments>https://cookievlog.tistory.com/155#entry155comment</comments>
      <pubDate>Fri, 21 Mar 2025 14:45:26 +0900</pubDate>
    </item>
    <item>
      <title>코테준비 | WHERE 절 서브쿼리 / EXISTS / 소수점 변환 / 두 날짜의 차이 (PostgreSQL)</title>
      <link>https://cookievlog.tistory.com/154</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp;Patient Support Analysis (Part 1)&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제] EXISTS 활용&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GQSDw/btsMOecsf7P/XLPKotxYG4UT4x4pZpKYsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GQSDw/btsMOecsf7P/XLPKotxYG4UT4x4pZpKYsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GQSDw/btsMOecsf7P/XLPKotxYG4UT4x4pZpKYsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGQSDw%2FbtsMOecsf7P%2FXLPKotxYG4UT4x4pZpKYsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;282&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- WITH문 풀이법 
WITH sub AS (
    SELECT policy_holder_id
    FROM callers
    GROUP BY policy_holder_id
    HAVING COUNT(DISTINCT case_id)&amp;gt;=3
)
SELECT COUNT(DISTINCT policy_holder_id) AS policy_holder_count
FROM sub&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1742263342869&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- WHERE저 다중커럼 서브쿼리 풀이법
SELECT COUNT(DISTINCT policy_holder_id) AS policy_holder_count
FROM callers
WHERE policy_holder_id IN ( SELECT DISTINCT policy_holder_id 
                            FROM callers 
                            GROUP BY policy_holder_id 
                            HAVING COUNT(DISTINCT case_id)&amp;gt;=3)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수정 코드 : WHERE 절 EXISTS 활용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735134967560&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT COUNT(DISTINCT policy_holder_id) AS policy_holder_count
FROM callers c1
WHERE EXISTS (SELECT 1
              FROM callers c2
              WHERE c1.policy_holder_id = c2.policy_holder_id
              GROUP BY c2.policy_holder_id
              HAVING COUNT(DISTINCT c2.case_id) &amp;gt;= 3
          )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;아이디어
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;WITH문 : ID 별 3번이상 콜한 회원 아이디 cte 생성 후 갯수 집계&amp;nbsp;&lt;/li&gt;
&lt;li&gt;다중컬럼 서브쿼리 :&amp;nbsp; ID 별 3번이상 콜한 회원 아이디를 WHERE 절에서 필터링한 후 바로 집계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이슈 : 다중컬럼 풀이는 서브쿼리 값을 아우터쿼리와 행 수준에서 하나씩 비교하기 때문에 비 효율적인 쿼리임&amp;nbsp;&lt;/li&gt;
&lt;li&gt;해결
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;`EXISTS` 함수 활용하여 해결&amp;nbsp;&lt;/li&gt;
&lt;li&gt;해당 문제에서는 ID 가 3번이상 콜했는지 `여부` 만 알면됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt; EXISTS (~ ) 는 서브쿼리가 값을 반환하면 TRUE 아니면 FALSE 임&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;따라서, 아이디를 INNER JOIN 해준 후&amp;nbsp; 서브쿼리 결과로 반환되는것만 살림&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다중컬럼 서브쿼리 필요시 EXISTS 함수 적용을 생각해 볼수 있음&amp;nbsp;&lt;/li&gt;
&lt;li&gt;WHERE EXISTS ( 서브쿼리 ) 에서 조인키를 활용하면 필터링 조건에 맞는 값만 빠르게 필터링 가능&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️Patient Support Analysis (Part 2)&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제] 소수점 처리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wsoVa/btsMNo7L94P/aqcuQzAeiMcJ41OeepbjdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wsoVa/btsMNo7L94P/aqcuQzAeiMcJ41OeepbjdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wsoVa/btsMNo7L94P/aqcuQzAeiMcJ41OeepbjdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwsoVa%2FbtsMNo7L94P%2FaqcuQzAeiMcJ41OeepbjdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1196&quot; height=&quot;397&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ROUND(SUM(CASE WHEN call_category IS NULL OR call_category='n/a' THEN 1 END)*100.0
              /COUNT(*),1) AS ncategorised_call_pct
FROM callers&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;POSTGRESQL 은 MYSQL 과 다르게 숫자형식을 맞춰줘야 소수점이 출력됨&lt;/li&gt;
&lt;li&gt;숫자 자료형 변환법
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;실수를 포함한 연산&amp;nbsp; : `1.0` `100.00` 을 곱해줌&amp;nbsp;&lt;/li&gt;
&lt;li&gt;함수 사용&lt;/li&gt;
&lt;li&gt;CAST(값 AS FLOAT)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;CONVERT (FLOAT,2)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742264145066&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--CAST(숫자 AS FLOAT) 로 실수형 변환 
SELECT CAST(2 AS FLOAT) / 3 AS divide;

--CONVERT(FLOAT,2) 로 실수형 변환 
SELECT CONVERT(FLOAT, 2) / 3 AS divide;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp;Server Utilization Time&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제] : 시각 차이를 원하는 값으로 반환하기&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OghYd/btsMOeXQFvd/sKWMLBBUkC5gmtW7GKMlQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OghYd/btsMOeXQFvd/sKWMLBBUkC5gmtW7GKMlQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OghYd/btsMOeXQFvd/sKWMLBBUkC5gmtW7GKMlQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOghYd%2FbtsMOeXQFvd%2FsKWMLBBUkC5gmtW7GKMlQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1193&quot; height=&quot;380&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WITH organized AS(
    SELECT *
    FROM server_utilization
    ORDER BY server_id,status_time
), lead_time AS (
    SELECT *,LEAD(status_time,1) OVER (PARTITION BY server_id) AS end_time 
    FROM organized
), diff AS(
    SELECT server_id
          ,status_time AS start_time, end_time
          ,end_time-status_time AS diff
          ,EXTRACT(EPOCH FROM (end_time - status_time))/3600 AS date_diff
    FROM lead_time 
    WHERE session_status = 'start'
)
SELECT ROUND(SUM(date_diff)/24,0) AS total_uptime_days
from diff&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;sever_id 별 start - stop 가동 시간 구하기&lt;/li&gt;
&lt;li&gt;아이디어&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;db가 어떻게 저장되어 있을지 모르니 server_id, status_time 기준으로 정렬&lt;/li&gt;
&lt;li&gt;server_id 기준 시각 당겨오기 ( stop_time 만들기)&lt;/li&gt;
&lt;li&gt;시각 차이 구하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;문제상황
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;해당 문제는 full-time (24시간) 을 1일로 침&amp;nbsp;&lt;/li&gt;
&lt;li&gt;date_part('day',end_time- status_time ) 결과의 경과 시각은 날짜값만 나옴 (시간 생략)&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;문제해결&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;`extract ( epoch from (diff))` 로 날짜 차이를 초 단위로 반환 &amp;rarr; 3600 나눠서 `시간` 단위로 가공&lt;/li&gt;
&lt;li&gt;&amp;nbsp;diff 의 합집계 값을 24시간으로 나눠서 `일` 로 변환&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PostgreSQL 날짜 /시간 함수 리마인드&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;timestamp 타입 연산&amp;nbsp;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2024/03/18 1:00:00 - 2024/03/20 2:00:00 =&amp;gt; interval(=json) 타입으로 반환됨 `days`: 2 `hours` :1&lt;/li&gt;
&lt;li&gt;2024/03/18 1:00:00&amp;nbsp; &lt;span style=&quot;color: #383a42; text-align: left;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;background-color: #f4f4f6; color: #383a42; text-align: left;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #986801; text-align: left;&quot;&gt;interval&lt;/span&gt;&lt;span style=&quot;background-color: #f4f4f6; color: #383a42; text-align: left;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #50a14f; text-align: left;&quot;&gt;'1 hour'&lt;/span&gt; =&amp;gt;&amp;nbsp; timestamp 타입으로 반환됨 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;2024/03/18 2:00:00 &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;경과 기간 원하는 타입으로 반환하기&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;EXTRACT ( 단위 FROM (diff))&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1742267329998&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#해당 단위만 추출
SELECT EXTRACT(YEAR FROM TIMESTAMP '2024-03-18 14:35:50');
SELECT EXTRACT(MONTH FROM TIMESTAMP '2024-03-18 14:35:50'); 
SELECT EXTRACT(DAY FROM TIMESTAMP '2024-03-18 14:35:50');
SELECT EXTRACT(HOUR FROM TIMESTAMP '2024-03-18 14:35:50'); 
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2024-03-18 14:35:50'); 
SELECT EXTRACT(SECOND FROM TIMESTAMP '2024-03-18 14:35:50');

#EPOCH : 1970-01-01 00:00:00 UTC(Unix Epoch Time)부터의 경과 시간을 초 단위로 반환합니다.
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2024-03-18 14:35:50');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 경과의 차이를 집계 한 후 원하는 타입으로 출력할때&lt;/li&gt;
&lt;li&gt;EXTRACT ( EPOCH FROM (DIFF)) 에서 /3600로 시간 변환 -&amp;gt; 24로 날짜로 변환&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL</category>
      <category>extract</category>
      <category>PostgreSQL</category>
      <category>SQL</category>
      <category>날짜함수</category>
      <category>시간함수</category>
      <category>코테준비</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/154</guid>
      <comments>https://cookievlog.tistory.com/154#entry154comment</comments>
      <pubDate>Tue, 18 Mar 2025 12:12:55 +0900</pubDate>
    </item>
    <item>
      <title>QCC | 6회차 코드 리뷰 &amp;amp; 피드백</title>
      <link>https://cookievlog.tistory.com/153</link>
      <description>&lt;h3 id=&quot;%E2%98%91%EF%B8%8F%EB%AC%B8%EC%A0%9C5)%20%EA%B3%A0%EA%B0%9D%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B4%80%EB%A6%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C-1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp; top3 조회하기&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTmZ8T/btsMKO5QySr/u8oQtgvK1ZbsdFZxlIbzyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTmZ8T/btsMKO5QySr/u8oQtgvK1ZbsdFZxlIbzyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTmZ8T/btsMKO5QySr/u8oQtgvK1ZbsdFZxlIbzyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTmZ8T%2FbtsMKO5QySr%2Fu8oQtgvK1ZbsdFZxlIbzyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;852&quot; height=&quot;680&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WITH dnk_t AS(
    SELECT *,ROW_NUMBER() OVER (PARTITION BY GENDER ORDER BY SCORE DESC,AGE DESC) AS dnk
    FROM students s
)
SELECT GENDER,NAME,SCORE
FROM dnk_t
WHERE dnk&amp;lt;=3
ORDER BY 1,dnk;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;그룹별 top3 추출이라 순번윈도우 함수 활용&lt;/li&gt;
&lt;li&gt;순번 건너뛰기등 옵션 없으므로 row_number 함수 사용&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pass&lt;/li&gt;
&lt;li&gt;그룹별 순위 필터링시 고민하지 말고 아묻따 윈도우 함수 사용하자&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E2%98%91%EF%B8%8F%EB%AC%B8%EC%A0%9C5)%20%EA%B3%A0%EA%B0%9D%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B4%80%EB%A6%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C-1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp; 모든 도서의 고객의 결제/ 미결제 총액 집계하기&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8cL6q/btsMKISlDyS/9r9dCqFwspykciOtQWd1FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8cL6q/btsMKISlDyS/9r9dCqFwspykciOtQWd1FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8cL6q/btsMKISlDyS/9r9dCqFwspykciOtQWd1FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8cL6q%2FbtsMKISlDyS%2F9r9dCqFwspykciOtQWd1FK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;347&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT b.title
	 ,ROUND(SUM(CASE WHEN bo.PAID_DATE IS NULL THEN boi.LINE_TOTAL ELSE 0 END),0) AS DUE
	 ,ROUND(SUM(CASE WHEN bo.PAID_DATE IS NOT NULL THEN boi.LINE_TOTAL ELSE 0 END),0)  AS PAID
FROM book_order_items boi
	INNER JOIN book_orders bo ON bo.ID =boi.ORDER_ID
	INNER JOIN books b ON b.ID= boi.BOOK_ID
GROUP BY b.title
ORDER BY 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수정 코드&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735134967560&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT b.title
	 ,ROUND(SUM(CASE WHEN bo.PAID_DATE IS NULL THEN boi.LINE_TOTAL ELSE 0 END),0) AS DUE
	 ,ROUND(SUM(CASE WHEN bo.PAID_DATE IS NOT NULL THEN boi.LINE_TOTAL ELSE 0 END),0)  AS PAID
FROM books b
    LEFT JOIN book_order_items ON b.ID= boi.BOOK_ID
    LEFT JOIN book_orders bo ON bo.ID =boi.ORDER_ID
GROUP BY b.title
ORDER BY 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;문제 이해만 10분 넘게 한 문제..
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;문제 이유 : 긴장감 / 테이블 3개 이상 나오면 pk/fk 헷갈림 (아래 복기해서 풀어보니 어렵지 않았다. 왜... 못풀었을까.. )&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시험 끝나고 복기해보며 짠 쿼리 아이디어
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;테이블 전부 조인&lt;/b&gt;&amp;nbsp;: 왜? 출력에 필요한 컬럼들이 테이블 각각에 존재 title 컬럼은 books 테이블에 , paid_date 는 book_orders 테이블에, line_total 은 books_order_items&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조인후 ,도서 제목별 조건하 각각 집계&lt;/b&gt; : paid_date 값이 없는것만 집계, 있는것만 집계 &amp;rarr; 각각 조건문 사용해서 작성
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&amp;nbsp;ROUND&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #000080;&quot;&gt;SUM&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;CASE&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;WHEN&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #8e00c6;&quot;&gt;bo&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #006464;&quot;&gt;PAID_DATE&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;IS&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;NULL&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;THEN&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #8e00c6;&quot;&gt;boi&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #006464;&quot;&gt;LINE_TOTAL&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;ELSE&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #0000ff;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;END&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;),&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #0000ff;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #006464;&quot;&gt;DUE&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;ROUND&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #000080;&quot;&gt;SUM&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;CASE&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;WHEN&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #8e00c6;&quot;&gt;bo&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #006464;&quot;&gt;PAID_DATE&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;IS&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;NOT&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;NULL&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;THEN&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #8e00c6;&quot;&gt;boi&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #006464;&quot;&gt;LINE_TOTAL&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;ELSE&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #0000ff;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;END&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;),&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #0000ff;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #800000;&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #006464;&quot;&gt;PAID&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #000000;&quot;&gt;문제 상황 : 조건문 쓰는 과정에서 paid_date 를 due_date를 잘못보고 due_date로 조건 걸다 값이 안나왔음. 결국 시험 이후 발견....&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #000000;&quot;&gt;추가 문제 &lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px; color: #000000;&quot;&gt;JOIN 방식이&lt;b&gt; LEFT JOIN&lt;/b&gt; 이여야함 -&amp;gt; 문제에서 '모든 도서'에 대해 결제 OR 미결제 금액을 찾는것이기 때문&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블 3개 있을때 유독 문제 이해가 오래걸림. PK/FK 조인키 기재해두고, 테이블 관계 생각후 JOIN 방식 채택 (적자!!!)&lt;/li&gt;
&lt;li&gt;결과값이 다를때 , 컬럼 잘못 사용한건 없는지 확인 필수!!!!!!!!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E2%98%91%EF%B8%8F%EB%AC%B8%EC%A0%9C5)%20%EA%B3%A0%EA%B0%9D%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B4%80%EB%A6%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C-1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp; 고객 첫주문 코호트의 리텐션 쿼리 작성&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;869&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nKYI9/btsMJNGBuLl/814CbdHL84fvbe2V4pVwB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nKYI9/btsMJNGBuLl/814CbdHL84fvbe2V4pVwB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nKYI9/btsMJNGBuLl/814CbdHL84fvbe2V4pVwB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnKYI9%2FbtsMJNGBuLl%2F814CbdHL84fvbe2V4pVwB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;907&quot; height=&quot;869&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;869&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 -&amp;gt; 오답&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WITH cohort AS (
	SELECT CUSTOMER_ID
		   ,DATE_FORMAT(ORDER_DATE,'%Y-%m') AS ORDER_MONTH
		   ,ROW_NUMBER () OVER (PARTITION BY CUSTOMER_ID ORDER BY order_date) AS rn
	FROM customer_orders co 
)
SELECT ORDER_MONTH AS FISRT_ORDER_MONTH
	 ,COUNT(CASE WHEN rn=1 THEN customer_id ELSE NULL END) AS COHORT_USER_COUNT
	 ,COUNT(CASE WHEN rn=2 THEN customer_id ELSE NULL END) AS USER_COUNT_1_MONTH_LATER
	 ,COUNT(CASE WHEN rn=3 THEN customer_id ELSE NULL END) AS USER_COUNT_2_MONTH_LATER
	 ,COUNT(CASE WHEN rn=4 THEN customer_id ELSE NULL END) AS USER_COUNT_3_MONTH_LATER
	 ,COUNT(CASE WHEN rn=5 THEN customer_id ELSE NULL END) AS USER_COUNT_4_MONTH_LATER
	 ,COUNT(CASE WHEN rn=6 THEN customer_id ELSE NULL END) AS USER_COUNT_5_MONTH_LATER
	 ,COUNT(CASE WHEN rn=7 THEN customer_id ELSE NULL END) AS USER_COUNT_6_MONTH_LATER
	 ,COUNT(CASE WHEN rn=8 THEN customer_id ELSE NULL END) AS USER_COUNT_7_MONTH_LATER
	 ,COUNT(CASE WHEN rn=9 THEN customer_id ELSE NULL END) AS USER_COUNT_8_MONTH_LATER
	 ,COUNT(CASE WHEN rn=10 THEN customer_id ELSE NULL END) AS USER_COUNT_9_MONTH_LATER
 	 ,COUNT(CASE WHEN rn=11 THEN customer_id ELSE NULL END) AS USER_COUNT_10_MONTH_LATER
	 ,COUNT(CASE WHEN rn=12 THEN customer_id ELSE NULL END) AS USER_COUNT_11_MONTH_LATER
	 ,COUNT(CASE WHEN rn=13 THEN customer_id ELSE NULL END) AS USER_COUNT_12_MONTH_LATER
FROM cohort
GROUP BY ORDER_MONTH
ORDER BY 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수정 코드 -&amp;gt; 복기하면서 재 쿼리&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735134967560&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WITH cohort AS (
	SELECT CUSTOMER_ID
		   ,MIN(DATE_FORMAT(ORDER_DATE,'%Y-%m-01')) OVER (PARTITION BY CUSTOMER_ID) AS FIRST_ORDER_DATE
		   ,DATE_FORMAT(ORDER_DATE,'%Y-%m-01') AS order_date
	FROM customer_orders co 
)
SELECT DATE_FORMAT(FIRST_ORDER_DATE,'%Y-%m') AS FIRST_ORDER_DATE
     ,COUNT(DISTINCT CUSTOMER_ID) AS COHORT_USER_COUNT
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 1 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_1_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 2 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_2_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 3 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_3_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 4 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_4_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 5 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_5_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 6 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_6_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 7 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_7_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 8 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_8_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 9 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_9_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 10 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_10_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 11 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_11_MONTH_LATER
     ,COUNT(DISTINCT CASE WHEN ORDER_DATE = DATE_ADD(FIRST_ORDER_DATE,INTERVAL 12 MONTH) THEN CUSTOMER_ID ELSE NULL END) AS USER_COUNT_12_MONTH_LATER
FROM cohort
GROUP BY FIRST_ORDER_DATE
ORDER BY 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;첫번째 아이디어
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;고객별 주문건수에 주문일자 순으로 순번 매김&lt;/li&gt;
&lt;li&gt;이걸 주문일자 기준으로 집계&amp;nbsp;&lt;/li&gt;
&lt;li&gt;문제 ) 첫 주문일자가 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;두번째 아이디어&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;고객, 고객별 최초주문일자,주문일자 cte 생성&lt;/li&gt;
&lt;li&gt;최초 주문일자 기준 고유 고객 수 집계&amp;nbsp;&lt;/li&gt;
&lt;li&gt;최초 주문일자 기준 그다음달 = 주문일자랑 같을때 고유 고객 수 집계&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;리텐션 코호트는 첫 구매일 기준 월별 방문수를 집계함&lt;/b&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;CTE 는 고객ID/ 고객별 최소주문날짜 / 주문 날짜 생성 해두고 시작함&lt;/li&gt;
&lt;li&gt;DATE_ADD 는 날짜형만 연산가능 월별 코호트 계산시, &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000080;&quot;&gt;DATE_FORMAT&lt;/span&gt;(&lt;span style=&quot;color: #006464;&quot;&gt;ORDER_DATE&lt;/span&gt;,&lt;span style=&quot;color: #008000;&quot;&gt;'%Y-%m-01'&lt;/span&gt;) 에 `-1` 주의할것&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코호트 리텐션은 결국 로직 까먹어서 제대로 못품&lt;/li&gt;
&lt;li&gt;마케팅 분석기법별 쿼리는 금주 확실하게 로직이해하고 넘어야할듯. 부실하게 이해하니까 연습 몇번한걸로는 적용 및 응용이 안된다는걸 다시 깨달음&lt;/li&gt;
&lt;li&gt;코테는 정답보다는 로직! 문제풀이시 항상 염두에 해둘것&lt;/li&gt;
&lt;li&gt;지금 수준별학습때 사용하는 RDB가 다양하다. MYSQL / POSTGRESQL/SQLIGHT 쿼리 작성간 피벗이 잘 안되서 과제문제 풀때도 애먹고 있고, 머리속에 함수들이 너무 혼재되어있음..(이번에 2021-06에 DATE_ADD 썻던것 처럼... )&lt;/li&gt;
&lt;li&gt;연습 더 철저하게 할 필요가 있겠음. 오전 코드카타 시간을 최대한 활용하자&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL</category>
      <category>qcc</category>
      <category>SQL</category>
      <category>내배캠</category>
      <category>리텐션쿼리</category>
      <category>코테준비</category>
      <category>코호트쿼리</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/153</guid>
      <comments>https://cookievlog.tistory.com/153#entry153comment</comments>
      <pubDate>Fri, 14 Mar 2025 12:58:40 +0900</pubDate>
    </item>
    <item>
      <title>코테준비 | Active User Retention /mau 조회하기(postgreSQL)</title>
      <link>https://cookievlog.tistory.com/152</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp;&lt;b&gt;Active User Retention&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjjr2/btsMFI4575I/QTHt0iAB2lrjhV3Y0bMLgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjjr2/btsMFI4575I/QTHt0iAB2lrjhV3Y0bMLgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjjr2/btsMFI4575I/QTHt0iAB2lrjhV3Y0bMLgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqjjr2%2FbtsMFI4575I%2FQTHt0iAB2lrjhV3Y0bMLgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;213&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DOrSl/btsMEQQDWLb/3WrLud27TmYVQkXcoefPk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DOrSl/btsMEQQDWLb/3WrLud27TmYVQkXcoefPk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DOrSl/btsMEQQDWLb/3WrLud27TmYVQkXcoefPk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDOrSl%2FbtsMEQQDWLb%2F3WrLud27TmYVQkXcoefPk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;133&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;2022년 7월 mau(월간 활성 사용자수 ) 조회하기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;7월 월간 사용자는 전월에도 활성 유저 여야함&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EXTRACT('MONTH' FROM event_date) AS month
      ,COUNT(DISTINCT user_id) AS monthly_active_users
FROM user_actions
WHERE event_type IN ('sign-in', 'like', 'comment')
AND TO_CHAR(event_date,'YYYY-MM') ='2022-07'
AND user_id IN (SELECT DISTINCT user_id
                FROM user_actions
                WHERE event_type IN ('sign-in', 'like', 'comment')
                  AND TO_CHAR(event_date,'YYYY-MM') ='2022-06')
GROUP BY EXTRACT('MONTH' FROM event_date)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수정 코드&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735134967560&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EXTRACT(MONTH FROM event_date) AS month
      ,COUNT(DISTINCT user_id) AS monthly_active_users
FROM user_actions AS curr
WHERE event_type IN ('sign-in', 'like', 'comment')
    AND TO_CHAR(event_date,'YYYY-MM') ='2022-07'
    AND EXISTS ( SELECT last.user_id 
                 FROM user_actions AS last
                 WHERE last.user_id = curr.user_id
                   AND EXTRACT(MONTH FROM last.event_date) =
                   EXTRACT(MONTH FROM curr.event_date - interval '1 month')
    			)
GROUP BY EXTRACT(MONTH FROM event_date)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;내코드 아이디어 :&amp;nbsp; where절 서브쿼리로 2022-6월 활성사용자수 필터링한 후 2022-7월 월간 활성자 수 집계
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;event_date : datetime type (ex&amp;nbsp;&lt;span style=&quot;background-color: #fcfcfc; color: #0a0a0a; text-align: left;&quot;&gt;05/31/2022 12:00:00 ) 에서 년-월만 추출하기&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #0a0a0a; text-align: left;&quot;&gt;`To_char(event_date,'YYYY-MM')` 하면 `2022-07` 반환됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #0a0a0a; text-align: left;&quot;&gt;`where in 다중행 서브쿼리`로 2022-06 월 활성유저가 2022-07 아우터 쿼리유저랑 같은 거만 집계&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #0a0a0a;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;특정 년/월 만 추출할때는 : EXTRACT(YEAR FROM event_date) / &lt;span style=&quot;background-color: #fcfcfc; color: #0a0a0a; text-align: left;&quot;&gt;EXTRACT(MONTH FROM event_date)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #0a0a0a;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #0a0a0a; text-align: left;&quot;&gt;&lt;span&gt;수정 코드 아이디어 : WHERE 절 `EXISTS` 서브쿼리 활용&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0a0a0a;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #0a0a0a; text-align: left;&quot;&gt;&lt;span&gt;▼상세설명&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0a0a0a;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #0a0a0a; text-align: left;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741366726506&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- WHERE EXISTS (서브쿼리) 
-- 문제에서 2022-07월 활성사용자가 2022-06월에도 활성사용자 이여야 하므로 위 함수 사용
AND EXISTS ( SELECT last.user_id --3. 필터링 된 유저가 exists 있으면 그것만 필터링
             FROM user_actions AS last
             WHERE last.user_id = curr.user_id -- 1. 연관 서브쿼리로 아우터 쿼리 user 연결 
               AND EXTRACT(MONTH FROM last.event_date) =
               EXTRACT(MONTH FROM curr.event_date - interval '1 month') -- 2.서브쿼리의 날짜가(6월) 아우터쿼리(7월) 보다 1달 전인
    			)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;where 절 서브쿼리로 필터링하기
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;WHERE EXISTS (서브쿼리) : '있다/없다' 만 빠르게 판별해주는 서브쿼리 &amp;rarr; 필요한 레코드만 검색하여 필터링 하기때문에 훨씬 효율적임&amp;nbsp;&lt;/li&gt;
&lt;li&gt;WHERE 컬럼 IN (서브쿼리 ) : 서브쿼리 전체를 스캔한 후 필터링&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;정리: 두 쿼리 비교&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3290&quot; data-start=&quot;2787&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&amp;nbsp;비교&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;where in&lt;/td&gt;
&lt;td&gt;where exsist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2943&quot; data-start=&quot;2832&quot;&gt;
&lt;td&gt;&lt;b&gt;6월 활동한 유저 필터링 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;IN (SELECT DISTINCT user_id ... )&lt;/td&gt;
&lt;td&gt;WHERE EXISTS (SELECT last.user_id ...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3150&quot; data-start=&quot;3065&quot;&gt;
&lt;td&gt;&lt;b&gt;성능 최적화&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서브쿼리에서 DISTINCT 연산이 발생하여 비효율적&lt;/td&gt;
&lt;td&gt;EXISTS() 사용으로 `필요한 레코드만 검색`하여 최적화됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3290&quot; data-start=&quot;3232&quot;&gt;
&lt;td&gt;&lt;b&gt;실행 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;데이터가 많아지면 느려질 가능성이 큼&lt;/td&gt;
&lt;td&gt;서브쿼리 실행 최적화로 빠르게 동작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;로직&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;IN (서브쿼리) 는 &lt;b&gt;전체 목록을 가져와서 비교&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;EXISTS (서브쿼리) 는 &lt;b&gt;한 개라도 발견되면 즉시 TRUE 반환&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;where in (스칼라 서브쿼리) 사용할 때 where exsist ( 서브쿼리) 로 하면 훨씬 효율 적임&amp;nbsp;&lt;/li&gt;
&lt;li&gt;where exsist 는 필요한 레코드만 검색하여 해당되는경우 즉시 true 반환해줌&lt;/li&gt;
&lt;li&gt;날짜의 특정 부분을 출력할때 :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;to_char(컬럼,'YYYY-MM)&lt;/li&gt;
&lt;li&gt;extract(year from 컬럼) , extract(month from 컬럼) : 각각 필터링 해줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1741367523762&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Facebook SQL Interview Question | DataLemur&quot; data-og-description=&quot;Facebook SQL Interview Question: Find the number of monthly active users (MAUs) in July 202.&quot; data-og-host=&quot;datalemur.com&quot; data-og-source-url=&quot;https://datalemur.com/questions/user-retention&quot; data-og-url=&quot;https://datalemur.com/questions/user-retention&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HZq8R/hyYmJMKyMP/BJJltdAOZkfXhyY2j5lFOK/img.gif?width=1484&amp;amp;height=780&amp;amp;face=0_0_1484_780,https://scrap.kakaocdn.net/dn/3g5lA/hyYqMA2CgS/F15VgraMacnqGeuvxEUX8K/img.gif?width=1484&amp;amp;height=780&amp;amp;face=0_0_1484_780&quot;&gt;&lt;a href=&quot;https://datalemur.com/questions/user-retention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://datalemur.com/questions/user-retention&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HZq8R/hyYmJMKyMP/BJJltdAOZkfXhyY2j5lFOK/img.gif?width=1484&amp;amp;height=780&amp;amp;face=0_0_1484_780,https://scrap.kakaocdn.net/dn/3g5lA/hyYqMA2CgS/F15VgraMacnqGeuvxEUX8K/img.gif?width=1484&amp;amp;height=780&amp;amp;face=0_0_1484_780');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Facebook SQL Interview Question | DataLemur&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Facebook SQL Interview Question: Find the number of monthly active users (MAUs) in July 202.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;datalemur.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>SQL</category>
      <category>PostgreSQL</category>
      <category>SQL</category>
      <category>sql mau구하기</category>
      <category>sql코딩테스트</category>
      <category>내배캠</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/152</guid>
      <comments>https://cookievlog.tistory.com/152#entry152comment</comments>
      <pubDate>Sat, 8 Mar 2025 02:12:07 +0900</pubDate>
    </item>
    <item>
      <title>PostgreSQL | 날짜/시간 함수 정리 (+ DataLemur 문제풀이)</title>
      <link>https://cookievlog.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;mySQL 과 postgreSQL RDB는 날짜/시간 처리에 사용하는 함수가 다르다. 코테 준비를 하면서 다양한 환경에서 쿼리를 작성 할수 있어야하기 때문에, 주로 사용하는 날짜/시간 함수를 정리했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;➡️&lt;/span&gt; PostgreSQL 날짜 타입&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 48px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 16.8217%; height: 16px;&quot;&gt;데이터 타입&lt;/td&gt;
&lt;td style=&quot;width: 35.31%; height: 16px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 47.8682%; height: 16px;&quot;&gt;예제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 16.8217%; height: 16px;&quot;&gt;DATE&lt;/td&gt;
&lt;td style=&quot;width: 35.31%; height: 16px;&quot;&gt;년-월-일&lt;/td&gt;
&lt;td style=&quot;width: 47.8682%; height: 16px;&quot;&gt;'2004-10-19'&amp;nbsp; or '10/19/2004'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 16.8217%; height: 16px;&quot;&gt;TIMESTAMP&lt;/td&gt;
&lt;td style=&quot;width: 35.31%; height: 16px;&quot;&gt;년-월-일-시-분-초&lt;/td&gt;
&lt;td style=&quot;width: 47.8682%; height: 16px;&quot;&gt;'2004-10-19 10:23:54' or '10/19/2004 10:23:54'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8217%;&quot;&gt;** INTERVAL ' A'&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;시간 간격&lt;/td&gt;
&lt;td style=&quot;width: 47.8682%;&quot;&gt;INTERVAL '1 day' ,interval '2 hours', interval '1 second' 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;postgreSQL 은 mysql 의 DATETIME 유형은 없음&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;➡️&lt;/span&gt; DATE / TIMESTAMP 타입 연산하기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1734845211139&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. date &amp;amp; 정수 연산  : date +- integer  &amp;rarr; date
SELECT date '2001-09-28' + 7
--  출력 : 2001-10-05

-- 2.date &amp;amp; Inteval 연산: date +- interval&amp;rarr;timestamp
select date '2001-09-28' + interval '1 hour'
-- 출력 : 2001-09-28 01:00:00

-- 3. ** date &amp;amp; date 연산: date - date &amp;rarr; integer 
select date date '2001-10-01' - date '2001-09-28'
-- 출력 : 3 (경과 일수 구하기)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1741325545607&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. timestamp 연산  : timestamp +- interval  &amp;rarr; timestamp
SELECT timestamp '2001-09-28 01:00' + interval '23 hours'
--  출력 : 2001-09-29 00:00:00

-- 2. **timestamp 간격을 interval 로 반환 : timestamp - timestamp &amp;rarr; interval 
select timestamp '2001-09-29 03:00' - timestamp '2001-07-27 12:00'
-- 출력 : 63 days 15:00:00 (경과 일/시 구해짐)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;➡️&lt;/span&gt; DATE/TIMESTAMP 타입 경과 기간 정수로 반환하기&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;날짜 사이의 간격/ 경과 일수 정수로 반환하려면
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;date 타입 이라면 단순연산: date - date&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; integer&amp;nbsp;&lt;/li&gt;
&lt;li&gt;timestamp 타입 이라면 연산 &amp;amp; 추가 함수 사용:&lt;span&gt;&amp;nbsp;&lt;/span&gt;timestamp - timestamp &amp;rarr; interval 이므로&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;timestamp&lt;span&gt; 타입 간의 기간을 정수로 반환하는 법&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734845221417&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. EXTRACT 함수 활용
-- post_date = timestamp type
SELECT EXTRACT(DAY FROM MAX(post_date)- MIN(post_date))

-- 2. 타입캐스트 로 DATE로 변환 후 연산 
SELCET MAX(post_date)::DATE-MIN(post_date)::DATE&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt; &lt;span&gt;➡️&lt;/span&gt; TYPE CAST (::) 개념&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 데이터 타입으로 변환할때 사용&amp;nbsp;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;958&quot; data-start=&quot;553&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;데이터타입&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;td&gt;예제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;665&quot; data-start=&quot;603&quot;&gt;
&lt;td&gt;DATE&lt;/td&gt;
&lt;td&gt;날짜 형식 (YYYY-MM-DD)&lt;/td&gt;
&lt;td&gt;SELECT '2025-03-07'::DATE;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;724&quot; data-start=&quot;666&quot;&gt;
&lt;td&gt;TIME&lt;/td&gt;
&lt;td&gt;시간 형식 (HH:MI:SS)&lt;/td&gt;
&lt;td&gt;SELECT '12:30:45'::TIME;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;795&quot; data-start=&quot;725&quot;&gt;
&lt;td&gt;TIMESTAMP&lt;/td&gt;
&lt;td&gt;날짜 + 시간&lt;/td&gt;
&lt;td&gt;SELECT '2025-03-07 12:30:45'::TIMESTAMP;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;879&quot; data-start=&quot;796&quot;&gt;
&lt;td&gt;TIMESTAMPTZ&lt;/td&gt;
&lt;td&gt;날짜 + 시간 + 타임존&lt;/td&gt;
&lt;td&gt;SELECT '2025-03-07 12:30:45+09'::TIMESTAMPTZ;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;958&quot; data-start=&quot;880&quot;&gt;
&lt;td&gt;INTERVAL&lt;/td&gt;
&lt;td&gt;시간 차이 (ex. '1 day', '2 hours')&lt;/td&gt;
&lt;td&gt;SELECT '3 days'::INTERVAL;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;➡️&lt;/span&gt; 날짜 관련 함수(EXTRACT / DATE_PART / DATE_TRUC)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;날짜 컬럼의 특정 부분 추출하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EXTRACT (단위 FROM 날짜컬럼)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;DATE_PART ( '단위', 컬럼)&lt;/li&gt;
&lt;li&gt;두 함수의 차이 : EXTRACT 는 정수로 반환 , DATE_PART 는 소수 포함 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734845211139&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1.날짜 컬럼 특정부분 추출 : EXTRACT(단위 FROM 컬럼)
SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
결과:2

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
 결과:16
 
-- 1-1. INTERVAL 추출시 아래와 같음 
SELECT EXTRACT(MONTH FROM INTERVAL '2년 13개월');
결과:1
 
 -- 2.날짜 컬럼 특정부분 추출 : DATE_PART('단위',컬럼)
 SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
 결과:16
 
 -- 3. 설정한 단위까지 자르기 : date_truc('단위',컬럼) 
date_trunc('hour', timestamp '2001-02-16 20:38:40')
결과 : 2001-02-16 20:00:00&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt; &lt;span&gt;➡️&lt;/span&gt; 날짜에서 특정 값 추출하기 (DATE_TRUC / TO_CHAR)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EX) timestamp = '2022-03-05' 에서 년-월만 추출해서 필터링 하고 싶다면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;DATE_TRUC &lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;DATE_TRUNC('month', timestamp) -&amp;gt; timestamp 로 반환됨 (YYYY-MM-DD HH:MM:SS)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;DATE_TRUNC('month', timestamp) -&amp;gt;&lt;b&gt; 2022-03-01 00:00:00 &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TO_CHAR&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;TO_CHAR( timestamp ,&amp;nbsp;&lt;span&gt;'YYYY-MM' &lt;/span&gt;) -&amp;gt; STRING 으로 반환 (YYYY-MM)&lt;/li&gt;
&lt;li&gt;TO_CHAR(&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;timestamp ,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;'YYYY-MM'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;)&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;2022-03&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;217&quot; data-start=&quot;186&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  MySQL과 PostgreSQL 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&quot; border=&quot;1&quot; data-end=&quot;483&quot; data-start=&quot;218&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;MYSQL&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;POSTGRESQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot; data-end=&quot;311&quot; data-start=&quot;266&quot;&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;&lt;b&gt;포맷 함수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;DATE_FORMAT()&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;TO_CHAR()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot; data-end=&quot;403&quot; data-start=&quot;312&quot;&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;&lt;b&gt;사용 예제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;SELECT DATE_FORMAT(NOW(), '%Y-%m');&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;SELECT TO_CHAR(NOW(), 'YYYY-MM');&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot; data-end=&quot;440&quot; data-start=&quot;404&quot;&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;&lt;b&gt;포맷 문자열&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;%Y-%m&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;YYYY-MM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot; data-end=&quot;483&quot; data-start=&quot;441&quot;&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;&lt;b&gt;출력 결과 (예시)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;2024-03&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot;&gt;2024-03&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp;&lt;b&gt;Average Post Hiatus (Part 1)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ePGN/btsMEbNs6XV/kHRd1neNW6kisNuHikbPJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ePGN/btsMEbNs6XV/kHRd1neNW6kisNuHikbPJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ePGN/btsMEbNs6XV/kHRd1neNW6kisNuHikbPJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ePGN%2FbtsMEbNs6XV%2FkHRd1neNW6kisNuHikbPJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1175&quot; height=&quot;522&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT user_id
      ,(MAX(post_date)::DATE-MIN(post_date)::DATE) AS days_between
FROM posts
WHERE EXTRACT(YEAR FROM post_date) = 2021
GROUP BY user_id
HAVING MAX(post_date) &amp;lt;&amp;gt; MIN(post_date)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;문제 상황
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;postgreSQL timestamp 날짜 연산시 `json` 형태로 반환함 (mysql에서는 동일 타입으로 반환)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741307926187&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT user_id
      ,MAX(post_date)-MIN(post_date)AS days_between
FROM posts
WHERE EXTRACT(YEAR FROM post_date) = 2021
GROUP BY user_id
HAVING MAX(post_date) &amp;lt;&amp;gt; MIN(post_date)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A7bTf/btsMCnBVPDy/39HMeJRbYW6MGYUNoglPS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A7bTf/btsMCnBVPDy/39HMeJRbYW6MGYUNoglPS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A7bTf/btsMCnBVPDy/39HMeJRbYW6MGYUNoglPS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA7bTf%2FbtsMCnBVPDy%2F39HMeJRbYW6MGYUNoglPS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;153&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이슈 해결&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;방법1) DATE 로 타입 변환 후 연산 : `MAX(post_date)::DATE-MIN(post_date)::DATE`&lt;/li&gt;
&lt;li&gt;방법2 ) 연산후 DAY 추출 : `DATE_PART( 'DAY',MAX(post_date)-MIN(post_date))`&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DATE_FORMAT 유사한 함수는 TO_CHAR&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DATE_ADD /DATE_SUB 와 유사한건, 연산자 &amp;amp; INTERVAL '단위'&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;날짜에서 특정값만 추출할때는&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;EXTRACT ( 단위 FROM 컬럼) &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DATE_PART ( '단위', 컬럼)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1741307279228&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;9.9.&amp;nbsp;Date/Time Functions and Operators&quot; data-og-description=&quot;9.9.&amp;nbsp;Date/Time Functions and Operators # 9.9.1. EXTRACT, date_part 9.9.2. date_trunc 9.9.3. date_bin 9.9.4. AT TIME ZONE and AT LOCAL 9.9.5. &amp;hellip;&quot; data-og-host=&quot;www.postgresql.org&quot; data-og-source-url=&quot;https://www.postgresql.org/docs/current/functions-datetime.html&quot; data-og-url=&quot;https://www.postgresql.org/docs/17/functions-datetime.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c1te3U/hyYm3RMMkP/07XubnHcMtI9qQKYiekW2k/img.png?width=540&amp;amp;height=557&amp;amp;face=0_0_540_557&quot;&gt;&lt;a href=&quot;https://www.postgresql.org/docs/current/functions-datetime.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.postgresql.org/docs/current/functions-datetime.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c1te3U/hyYm3RMMkP/07XubnHcMtI9qQKYiekW2k/img.png?width=540&amp;amp;height=557&amp;amp;face=0_0_540_557');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;9.9.&amp;nbsp;Date/Time Functions and Operators&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;9.9.&amp;nbsp;Date/Time Functions and Operators # 9.9.1. EXTRACT, date_part 9.9.2. date_trunc 9.9.3. date_bin 9.9.4. AT TIME ZONE and AT LOCAL 9.9.5. &amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.postgresql.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1741307797504&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Average Post Hiatus | Facebook SQL Interview Question&quot; data-og-description=&quot;Facebook SQL Interview Question: Write a query to obtain days between users first and last post in 2021.&quot; data-og-host=&quot;datalemur.com&quot; data-og-source-url=&quot;https://datalemur.com/questions/sql-average-post-hiatus-1&quot; data-og-url=&quot;https://datalemur.com/questions/sql-average-post-hiatus-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c0XCgT/hyYp9ptwQv/eqWqIRhH6wQ4NPYxuJj2f0/img.gif?width=1484&amp;amp;height=780&amp;amp;face=0_0_1484_780,https://scrap.kakaocdn.net/dn/rJenZ/hyYneltjVn/EMfRgyrDX7rb6o06oKuEA1/img.gif?width=1484&amp;amp;height=780&amp;amp;face=0_0_1484_780&quot;&gt;&lt;a href=&quot;https://datalemur.com/questions/sql-average-post-hiatus-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://datalemur.com/questions/sql-average-post-hiatus-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c0XCgT/hyYp9ptwQv/eqWqIRhH6wQ4NPYxuJj2f0/img.gif?width=1484&amp;amp;height=780&amp;amp;face=0_0_1484_780,https://scrap.kakaocdn.net/dn/rJenZ/hyYneltjVn/EMfRgyrDX7rb6o06oKuEA1/img.gif?width=1484&amp;amp;height=780&amp;amp;face=0_0_1484_780');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Average Post Hiatus | Facebook SQL Interview Question&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Facebook SQL Interview Question: Write a query to obtain days between users first and last post in 2021.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;datalemur.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL</category>
      <category>PostgreSQL</category>
      <category>sql 날짜함수</category>
      <category>내배캠</category>
      <category>코테준비</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/151</guid>
      <comments>https://cookievlog.tistory.com/151#entry151comment</comments>
      <pubDate>Fri, 7 Mar 2025 15:33:07 +0900</pubDate>
    </item>
    <item>
      <title>SQL 분석기법 | 퍼널 분석 종류 (Open/Closed/Direct funnel) + 주피터 노트북으로 SQL 환경 구축)</title>
      <link>https://cookievlog.tistory.com/150</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt; &lt;span&gt;➡️&lt;/span&gt; 퍼널 분석 (Funnel Analysis)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 특정 목표(구매, 회원가입, 예약 등)에 도달하는 과정에서의 단계별 이탈률을 분석하는 기법&lt;/li&gt;
&lt;li&gt;`사용자 경험을 최적화` 하는 분석기법 중 하나임&lt;/li&gt;
&lt;li&gt;서비스 사용 과정에서 이탈률이 가장 큰 단계를 파악 하는데 도움을 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;➡️&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;사용자 경험 최적화 분석법&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;퍼널 분석&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 단계에서 이탈하는지 확인하기 위한 분석 (순방향 )&lt;/li&gt;
&lt;li&gt;한계점 : 어떻게 이탈하는지는 알수없음&amp;nbsp;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfhVYC/btsMCnnu7tJ/MzyPxB9M83Bi5S5gCmk2t1/img.png&quot; width=&quot;642&quot; height=&quot;427&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;852&quot; data-is-animation=&quot;false&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유저패스 분석&lt;/b&gt; &lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떻게 이탈하는지 확인하기 위한 분석 (순방향 x)&lt;/li&gt;
&lt;li&gt;ex) 이전단계로 돌아가는지? 아예 이탈하는지? 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/38OVS/btsMC32ZBxa/RkAUrus2AHiO2wKUImG8kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/38OVS/btsMC32ZBxa/RkAUrus2AHiO2wKUImG8kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/38OVS/btsMC32ZBxa/RkAUrus2AHiO2wKUImG8kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F38OVS%2FbtsMC32ZBxa%2FRkAUrus2AHiO2wKUImG8kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;505&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;➡️퍼널분석 종류&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개방형 (OPEN) : 사용자가 `어떤 단계든 퍼널 진입` &amp;amp;순서는 지키면서 &lt;b&gt;다음 단계로 진행한&lt;/b&gt; 사용자만 분석
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: &quot;회원가입 &amp;rarr; 장바구니 &amp;rarr; 결제&quot; 과정의 각 단계별 사용자 수 확인&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSMO0p/btsMDy9h2gm/zmxSw8sURjGSRQYad259V1/img.png&quot; width=&quot;577&quot; height=&quot;166&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;369&quot; data-is-animation=&quot;false&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;폐쇄형 (CLOSED) : `&lt;b&gt;시작을 고정`하고 &amp;amp; 순서를 지키면서 다음 단계로 진행한&lt;/b&gt; 사용자만 분석&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: &quot;제품 상세 페이지를 방문한 후 결제한 사용자 비율&quot;&lt;/li&gt;
&lt;li&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FlRnq/btsMB5Hdjz4/LjXkwMYOSRwEBPRc0KXR3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FlRnq/btsMB5Hdjz4/LjXkwMYOSRwEBPRc0KXR3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FlRnq/btsMB5Hdjz4/LjXkwMYOSRwEBPRc0KXR3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFlRnq%2FbtsMB5Hdjz4%2FLjXkwMYOSRwEBPRc0KXR3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;369&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;엄격한 폐쇄형 (DIRECT) : `&lt;b&gt;정해진 경로`를&lt;/b&gt; `&lt;b&gt;중간 이탈 없이` `바로 다음 단계로 진행`&lt;/b&gt;한 사용자만 분석
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: &quot;로그인 &amp;rarr; 상품 탐색 &amp;rarr; 구매&quot;의 연속적인 흐름만 고려&lt;/li&gt;
&lt;li&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BXzXj/btsMDzf3oHD/WDrO9kyoOb5eOwDskIGPaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BXzXj/btsMDzf3oHD/WDrO9kyoOb5eOwDskIGPaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BXzXj/btsMDzf3oHD/WDrO9kyoOb5eOwDskIGPaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBXzXj%2FbtsMDzf3oHD%2FWDrO9kyoOb5eOwDskIGPaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;380&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;span&gt;✏️추가 질의 응답&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;질문)&lt;br /&gt;만약 '1단계 :가입 &amp;rarr; 2단계 : 로그인 &amp;rarr; 3단계 : 구독' 퍼널이 있을때&lt;br /&gt;가입&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;로그인 전환율 50%&amp;nbsp; &amp;amp; 로그인&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;구독&amp;nbsp;전환율이 70%일 경우&amp;nbsp;&lt;br /&gt;1단계 전환율 &amp;lt; 2단계 전환율 이므로 &lt;b&gt;개방형 퍼널(open) 이라고 볼수 있을까?&lt;/b&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;답변 )&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;➡️주피터 노트북으로 SQL 환경 구축하기 (SQLite)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Dbeaver 외에 주피터 노트북, 파이썬으로 sql 환경을 구축 할수 있음&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연습해보고 싶은 샘플 데이터를 생성하고, sql로 추출해볼 수 있음&lt;/li&gt;
&lt;li&gt;모듈 : `sqlite3`&lt;/li&gt;
&lt;li&gt;메모리에 일시적으로 저장함 (휘발성)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SQLITE vs MYSQL
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQLite는 파일 기반이지만, MySQL은 서버 기반으로 실행하기 전에 MySQL 서버를 실행 중이어야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파이썬으로 쿼리 작성 및 출력하기&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;따옴표 안에 쿼리 작성&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;출력시 `pd.read_sql(쿼리저장 변수명, 메모리변수)`&lt;/li&gt;
&lt;li&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;query_open_funnel = &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'''&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;SELECT funnel_step, event_name, COUNT(DISTINCT user_id) AS user_count&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;FROM event_logs&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;GROUP BY funnel_step, event_name&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;ORDER BY funnel_step&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'''&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;df_open_funnel = pd.read_sql&lt;/span&gt;&lt;span style=&quot;color: #dcdcdc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;query_open_funnel&lt;/span&gt;&lt;span style=&quot;color: #dcdcdc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; conn&lt;/span&gt;&lt;span style=&quot;color: #dcdcdc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;df_open_funnel&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;주의 : 쿼리 작성 완료후 메모리 종료
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #6aa94f;&quot;&gt;# SQLite 연결 종료&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;conn.close&lt;/span&gt;&lt;span style=&quot;color: #dcdcdc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741187688242&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. sqlite db 환경 구축
import sqlite3
import pandas as pd

# SQLite 데이터베이스 연결
conn = sqlite3.connect(&quot;:memory:&quot;)
cursor = conn.cursor()
print(&quot;SQLite in-memory database connected!&quot;)

# 퍼널 분석을 위한 샘플 테이블 생성 (funnel_step 추가)
cursor.execute('''
CREATE TABLE event_logs (
    user_id INTEGER,
    event_name TEXT,
    funnel_step INTEGER,
    event_time TIMESTAMP
)
''')
conn.commit()
print(&quot;Event logs table with funnel_step created!&quot;)

# 샘플 데이터 삽입 (funnel_step 추가)
sample_data = [
    (1, 'signup', 1, '2024-03-01 10:00:00'),
    (1, 'add_to_cart', 2, '2024-03-01 10:05:00'),
    (1, 'purchase', 3, '2024-03-01 10:10:00'),
    (2, 'signup', 1, '2024-03-02 09:00:00'),
    (2, 'add_to_cart', 2, '2024-03-02 09:10:00'),
    (3, 'signup', 1, '2024-03-02 11:00:00'),
    (3, 'purchase', 3, '2024-03-02 11:15:00'),
    (4, 'signup', 1, '2024-03-03 08:00:00'),
    (5, 'signup', 1, '2024-03-04 07:00:00'),
    (5, 'add_to_cart', 2, '2024-03-04 07:05:00'),
    (5, 'purchase', 3, '2024-03-04 07:10:00')
]

cursor.executemany(&quot;INSERT INTO event_logs (user_id, event_name, funnel_step, event_time) VALUES (?, ?, ?, ?)&quot;, sample_data)
conn.commit()
print(&quot;Sample data inserted with funnel_step!&quot;)

# 쿼리문 작성 
query_open_funnel = '''
SELECT funnel_step, event_name, COUNT(DISTINCT user_id) AS user_count
FROM event_logs
GROUP BY funnel_step, event_name
ORDER BY funnel_step
'''

df_open_funnel = pd.read_sql(query_open_funnel, conn)
df_open_funnel

# SQLite 연결 종료
conn.close()
print(&quot;Database connection closed!&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1741186629911&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[GA4] Funnel exploration - Analytics Help&quot; data-og-description=&quot;Funnel exploration lets you visualize the steps your users take to complete a task and quickly see how well they are succeeding or failing at each step. For example, how do prospects become shoppers and then become buyers? How do one time buyers become rep&quot; data-og-host=&quot;support.google.com&quot; data-og-source-url=&quot;https://support.google.com/analytics/answer/9327974?hl=en&quot; data-og-url=&quot;https://support.google.com/analytics/answer/9327974?hl=en&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://support.google.com/analytics/answer/9327974?hl=en&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://support.google.com/analytics/answer/9327974?hl=en&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[GA4] Funnel exploration - Analytics Help&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Funnel exploration lets you visualize the steps your users take to complete a task and quickly see how well they are succeeding or failing at each step. For example, how do prospects become shoppers and then become buyers? How do one time buyers become rep&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;support.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL</category>
      <category>SQL</category>
      <category>개방형퍼널</category>
      <category>파이썬으로sql</category>
      <category>퍼널분석</category>
      <category>폐쇄형퍼널</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/150</guid>
      <comments>https://cookievlog.tistory.com/150#entry150comment</comments>
      <pubDate>Thu, 6 Mar 2025 00:18:12 +0900</pubDate>
    </item>
    <item>
      <title>코테준비 | MYSQL 행정구역별 주소 데이터 분리하기 (문자열 SPLIT 하기- SUBSTRING_INDEX)</title>
      <link>https://cookievlog.tistory.com/149</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☑️&amp;nbsp;전국 카페 주소 데이터 정제하기&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;[문제]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;주소 컬럼에서 행정구역별 컬럼 분리 후 카페 갯수 집계 하기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[문제 풀이]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734844556106&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT SUBSTRING_INDEX(address,' ',1) AS sido
      ,SUBSTRING_INDEX(SUBSTRING_INDEX(address,' ',2),' ',-1) AS sigungu
      ,COUNT(DISTINCT cafe_id) AS cnt
FROM cafes
GROUP BY sido,sigungu
ORDER BY 3 DESC&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이슈 및 해결 과정 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;아이디어 : 주소 컬럼에서 행정구역별 추가 컬럼 생성 후 집계
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;행정구역 분리 : `공백` 기준으로 python 에서 `SPLIT` 함수 쓰는이 분리 하면 됨&amp;nbsp;&lt;/li&gt;
&lt;li&gt;ex) address 컬럼 값이 '서울시 송파구 오금동 23-5' 일때, sido 컬럼은 '서울시' sigungu 컬럼은 '송파구' 로 분리한 후 각각의 갯수 집계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;`SUBSTRING_INDEX` : SQL 에서 문자열 쪼개주는 함수 ( python 에서 split 하듯!)&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;SUBSTRING_INDEX&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: center;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #006dd7; text-align: center;&quot;&gt;문자열&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: center;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #8a3db6; text-align: center;&quot;&gt;구분자&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: center;&quot;&gt;,개수&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: center;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: center;&quot;&gt;개수 : 양수면 왼쪽부터 / 음수면 오른쪽 부터!&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: center;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: center;&quot;&gt;특이 사항 : 파이썬 split의 경우 분리된 특정 구간을 바로 추출 할 수 있으나, substring_index는 개수까지 문자열 모두 추출 됨&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot;&gt;파이썬 ex) a= &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;1000|2000|3000 에서 2000을 추출하고 싶다면 -&amp;gt;&amp;nbsp; a.split('|')[1]&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;sql ex)&amp;nbsp; SELECT SUBSTRING_INDEX(a, ' | ' , 2) 하면 -&amp;gt; 1000|2000 로 출력됨&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741185715654&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--SUBSTRING_INDEX 예시 -- 

SELECT SUBSTRING_INDEX('apple,banana,grape', ',', 1);
-- 출력 : apple 

SELECT SUBSTRING_INDEX('apple,banana,grape', ',', 2);
-- 출력 : apple,banana

SELECT SUBSTRING_INDEX('apple,banana,grape', ',', -1);
-- 출력 : grape

-- ',' 기준 두번째 값만 추출하려면 ? (banana만 추출하기) -&amp;gt; 원하는 문자열까지 추출 한 후 함수 중첩
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,grape', ',', 2), ',', -1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한줄 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 컬럼에서 특정문자 기준 분리시 -&amp;gt; SUBSTRING_INDEX 함수 활용&amp;nbsp;&lt;/li&gt;
&lt;li&gt;문자열 여러 덩어리로 분리시킬경우 -&amp;gt; SUBSTRING_INDEX 중첩 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1741184592517&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MySQL에서 특정 문자로 문자열 SPLIT 하기 - SUBSTRING_INDEX&quot; data-og-description=&quot;MYSQL에서는 특정 문자를 기준으로 SPLIT해서 해당 값을 여러 열로 나누어야 할 일이 발생했을때 사용하는 방법을 작성해보겠습니다.&amp;nbsp;위와같이 THRESHOLD라는 컬럼이 파이프라인( | )으로 이루어져 &quot; data-og-host=&quot;dreamcoding.tistory.com&quot; data-og-source-url=&quot;https://dreamcoding.tistory.com/78&quot; data-og-url=&quot;https://dreamcoding.tistory.com/78&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oRxzv/hyYmTBrySJ/ErUG5I2OEP7eo6TAbUNMI0/img.png?width=255&amp;amp;height=368&amp;amp;face=0_0_255_368,https://scrap.kakaocdn.net/dn/df6cZ1/hyYmJMlpnV/qxQPNOKlVrHmsQR6eYC5B1/img.png?width=255&amp;amp;height=368&amp;amp;face=0_0_255_368,https://scrap.kakaocdn.net/dn/hgB8C/hyYndGzgsi/EcSbQyc7jkKxhqnTyzqPx0/img.jpg?width=1440&amp;amp;height=1080&amp;amp;face=0_0_1440_1080&quot;&gt;&lt;a href=&quot;https://dreamcoding.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dreamcoding.tistory.com/78&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oRxzv/hyYmTBrySJ/ErUG5I2OEP7eo6TAbUNMI0/img.png?width=255&amp;amp;height=368&amp;amp;face=0_0_255_368,https://scrap.kakaocdn.net/dn/df6cZ1/hyYmJMlpnV/qxQPNOKlVrHmsQR6eYC5B1/img.png?width=255&amp;amp;height=368&amp;amp;face=0_0_255_368,https://scrap.kakaocdn.net/dn/hgB8C/hyYndGzgsi/EcSbQyc7jkKxhqnTyzqPx0/img.jpg?width=1440&amp;amp;height=1080&amp;amp;face=0_0_1440_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL에서 특정 문자로 문자열 SPLIT 하기 - SUBSTRING_INDEX&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MYSQL에서는 특정 문자를 기준으로 SPLIT해서 해당 값을 여러 열로 나누어야 할 일이 발생했을때 사용하는 방법을 작성해보겠습니다.&amp;nbsp;위와같이 THRESHOLD라는 컬럼이 파이프라인( | )으로 이루어져&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dreamcoding.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL</category>
      <category>MySQL</category>
      <category>Split</category>
      <category>SQL</category>
      <category>substring</category>
      <category>내배캠</category>
      <category>코딩테스트준비</category>
      <author>성장하는 쿠키의 로그 기록</author>
      <guid isPermaLink="true">https://cookievlog.tistory.com/149</guid>
      <comments>https://cookievlog.tistory.com/149#entry149comment</comments>
      <pubDate>Wed, 5 Mar 2025 23:44:08 +0900</pubDate>
    </item>
  </channel>
</rss>