coding/sql 코딩테스트

[solvesql] 온라인 쇼핑몰의 Stickiness

임이레 2025. 4. 10. 19:56

구해야하는 컬럼은 dt , dau , wau , dau/wau 지표. 

wau 를 구하는 방식에서 JOIN 이 머릿속에서 구조화가 되지 않아서 너무 힘들었기에 다시 한번 정리한다. 

 

1. 먼저 11월 한달간의 dau를 구하는것은 너무나도 쉽다. 

2. 그러나 , wau 를 구하려면 dt 기준에서 7일간의 dt 를 JOIN 을 해야하는데 

 

먼저 정답인 쿼리는 

select 
  dt 
  ,dau
  ,wau 
  ,round(dau/wau,2) as stickiness
from (
  select d.order_date as dt , 
          count(distinct d.customer_id) as dau , 
          count(distinct w.customer_id) as wau  
  from records d join records w on w.order_date between date_add(d.order_date,  interval -6 day) and d.order_date
  where date_format(d.order_date, '%Y-%m-%d') between '2020-11-01' and '2020-11-31'
  group by dt 
) as t 
order by dt asc ;

 

 

<구조화 연습> 

SQL 분석 문제를 풀 때 먼저는 머릿속에 습관 처럼 넣어두어야 할 항목을 정리해봤다.

1. 집계 기준은 무엇인가? 

-> 하루인지, 월인지, 가입일인지 등 

2. 집계 대상 구간을 어떻게 잡을 것인가? 

-> 이전 7일? 이후 30일? 해당 월? 등 

3. 기준 테이블 vs 대상 테이블을 나누기 즉, 항상 분리된 테이블처럼 사고해야한다. 

 

위의 문제로 다시 한번 정리하자면 

기준 테이블 (d) 대상 테이블(w) JOIN 조건 목적 
d.order_date w.order_date (7일치)  w.order_date 뭔데? d.order_date - 6 AND d.order_date 사이에 포함된 date 모두야!  wau의 구간을 잡기 위해 JOIN 

 

 

SQL은 구조화만 잘해서, 어떻게 문제를 풀지 잘 정의해두면 못 풀 문제는 없다.. ㅠ 하지만 구조화하는게 너무 어려울뿐..