본문 바로가기
Data Science/SQL

T사 SQL 쿼리테스트 대비: MAU

by 에르모사 쩐뉴 2026. 2. 5.

1. MAU 정의

MAU (Monthly Active Users) 

한달 동안 서비스를 이용한 순수 이용자 수

 

  • Monthly: 기준이 되는 한 달(보통 1일~말일) 동안.
  • Active: 단순히 가입된 상태가 아니라, 앱 실행, 로그인, 클릭 등 '활동'을 한 유저.
  • Users: 중복을 제거한(Unique) 실제 사람 수. 한 사람이 100번 방문해도 MAU는 1로 집계됩니다.

주의사항

MAU를 구할 때 할 수 있는 실수는 DISTINCT를 빼먹는 것

  • 오답: SELECT COUNT(user_id) FROM Logs (중복 방문이 다 카운트되어 숫자가 뻥튀기됨.)
  • 정답: SELECT COUNT(DISTINCT user_id) FROM Logs (한 달 동안의 '순수' 유저 수만 추출.)

 

 

2. MAU와 함께 세트로 외워야 할 놈들

지표 풀네임 의미 비고
DAU Daily Active Users 하루 동안의 순수 이용자 수 게임, SNS 등 매일 쓰는 앱에서 중요
WAU Weekly Active Users 일주일 동안의 순수 이용자 수 주간 단위 리듬 확인
Stickiness 고착도 DAU / MAU 유저가 우리 서비스에 얼마나 '중독'됐나 측정

 

3. 예상 문제 

  • 이 MAU 중에 **신규(New)**는 몇 명인가?
  • 지난달에 이어 이번 달에도 온 **유지(Retained)**는 몇 명인가?
  • 한동안 안 오다 다시 온 **복귀(Reactivated)**는 몇 명인가?

 

4. 가상 문제 

[문제] 월별 유저 활동 타입 분석

UserLogs 테이블에는 유저의 활동 기록이 담겨 있습니다. 이 데이터를 바탕으로 매달 서비스를 이용한 유저(MAU)를 다음 두 가지 타입으로 분류하여 월별 유저 수를 산출하는 SQL 쿼리를 작성하십시오.

  • Retained (유지): 이번 달에 방문했고, 바로 직전 달에도 방문 기록이 있는 유저.
    New/Reactivated (신규 및 복귀): 이번 달에 방문했으나, 바로 직전 달에는 방문 기록이 없는 유저.

  • 출력 컬럼: visit_month (연-월-01 형태), user_type (타입 명칭), user_count (유저 수)
  • 정렬: visit_month 기준 오름차순.
WITH MonthlyVisit AS (
    # 1단계: 유저별 월별 방문 여부 집계
    SELECT DISTINCT user_id, 
           DATE_FORMAT(event_timestamp, '%Y-%m-01') AS visit_month
    FROM UserLogs
),

UserStatus AS (
    # 2단계: 이번 달 방문자와 지난 달 방문자를 비교
    SELECT cur.visit_month,
           cur.user_id,
           CASE 
               WHEN prev.user_id IS NULL THEN 'New/Reactivated' -- 지난달 이력 없음
               ELSE 'Retained' -- 지난달에도 옴
           END AS user_type
    FROM MonthlyVisit cur
    LEFT JOIN MonthlyVisit prev 
           ON cur.user_id = prev.user_id 
          AND cur.visit_month = DATE_ADD(prev.visit_month, INTERVAL 1 MONTH)
)

# 3단계: 최종 MAU 및 타입별 비중 산출
SELECT visit_month,
       user_type,
       COUNT(DISTINCT user_id) AS user_count
FROM UserStatus
GROUP BY visit_month, user_type
ORDER BY visit_month;

 

 

5. 코드 분석

  • LEFT JOIN을쓰는 이유:  저번 달에 안 온 사람(신규/복귀)도 이번 달 MAU에는 포함되어야 하기 때문
  • UserStatus 절 
유저 ID cur.visit_month
(이번달)
prev.visit_month
(저번달)
DATE_ADD 결과 결과
A 2026-02-01 2026-01-01 2026-02-01 매칭 성공 (Retained)
B 2026-02-01 (기록 없음) NULL 매칭 실패 (New/Reactivated)