인프런 커뮤니티 질문&답변

양승엽님의 프로필 이미지
양승엽

작성한 질문수

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

[인프런 빅쿼리 빠짝스터디 3주차] 리텐션 분석

작성

·

51

0

1) 리텐션 연습 문제

https://torch-cart-08d.notion.site/3-139701964d8c805d9e49f3c68ab9b0b5

 

2) 3주차 추가 문제

1번 문제(15분)

  • 주차별 각 카테고리별 평균 할인율이 가장 높았던 기간과 할인율을 구하는 쿼리를 작성해주세요

    • 단, 날짜 데이터를 YYYY-MM-DD 23:59:39 이런 형태로 변경해주세요

SELECT
  *,
  RANK() OVER(PARTITION BY category ORDER BY rate DESC) AS category_rank
FROM (
SELECT
    category,
    FORMAT_DATETIME('%Y-%m-%d 23:59:39', PARSE_DATETIME('%m/%d/%Y %H:%M:%S', transaction_date)) AS transaction_date,
    actual_price,
    list_price,
    ((list_price - actual_price) / list_price) * 100 AS rate
  FROM transaction_data AS td
  LEFT JOIN item_info ii
  ON td.item_id = ii.item_id
)
QUALIFY category_rank = 1
ORDER BY category, transaction_date

 

2번 문제(10분)

  • 2024년 1월에 가장 많은 매출을 기록한 카테고리를 구하는 쿼리를 작성해주세요

SELECT
  category,
  SUM(actual_price) AS total_price
FROM (
  SELECT
    category,
    FORMAT_DATETIME('%Y-%m-%d 23:59:39', PARSE_DATETIME('%m/%d/%Y %H:%M:%S', transaction_date)) AS transaction_date,
    actual_price,
  FROM transaction_data AS td
  LEFT JOIN item_info ii
  ON td.item_id = ii.item_id
  WHERE EXTRACT(MONTH FROM PARSE_DATETIME('%m/%d/%Y %H:%M:%S', transaction_date)) = 1
)
GROUP BY ALL
ORDER BY total_price DESC
LIMIT 1

 

3번 문제(10분)

  • 유저별 총 구매 금액이 200만원 이상인 유저들이 가장 많이 구매한 카테고리를 찾는 쿼리를 작성해주세요

over_200 AS (
  SELECT
    td.user_id,
    SUM(actual_price) AS user_price
  FROM transaction_data AS td
  LEFT JOIN user_info AS ui
  ON td.user_id = ui.user_id
  GROUP BY ALL
  HAVING user_price >= 2000000
)

SELECT
  category,
  COUNT(*) AS cnt
FROM over_200 AS O2
CROSS JOIN transaction_data AS td
LEFT JOIN item_info AS ii
ON td.item_id = ii.item_id
GROUP BY ALL
ORDER BY cnt DESC
LIMIT 1
  • 약 20분/5분/8분 소요

  • 1번 문제에서 날짜 데이터를 변환하는 방법이 떠오르지 않아 시간이 많이 소요됐습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 양승엽님의 질문에 대한 답변을 드리겠습니다.

우선, 1번 문제를 해결하는 과정에서 날짜 데이터를 YYYY-MM-DD 23:59:39 형태로 변환하는 방법은 FORMAT_DATETIME() 함수를 사용하면 됩니다. 이미 올바른 접근을 하고 계신 것으로 보입니다. 이 함수를 활용하여 데이터를 형식에 맞춰 변환할 수 있습니다. 쿼리 작성 시 FORMAT_DATETIME()PARSE_DATETIME()을 적절하게 사용하셨네요.

1번 문제에서의 주의점은, FORMAT_DATETIME() 함수 내에서 사용하고 있는 PARSE_DATETIME()의 포맷이 입력 데이터의 실제 포맷과 일치해야 한다는 점입니다.

2번 문제에서는 2024년 1월에 가장 많은 매출을 기록한 카테고리를 구하는 과정에서 EXTRACT() 함수를 사용해 월을 추출하는 방법도 잘 사용하셨습니다.

3번 문제의 경우, 총 구매 금액을 기준으로 사용자 리스트를 필터링하고, 그 사용자들이 가장 많이 구매한 카테고리를 찾는 접근도 적절하게 잘 이루어졌습니다. CROSS JOIN으로 각 유저의 거래 정보를 다시 결합하여 카테고리를 찾는 방법을 사용하고 계신 점에서 쿼리 작성이 잘 준비되었음을 알 수 있습니다.

관련하여 유용한 참고 사항으로, 리텐션 분석 및 다양한 지표 정의에 관한 답변을 찾아내어 공유드립니다:

  • 리텐션 관련 자세한 접근 방법 및 해석에 도움을 줄 수 있는 4-8. 지표 정의 연습 문제 풀이 답변 올려볼게요!을 참고하시는 것도 좋습니다. 데이터와 코호트를 어떻게 분리하고 분석할 수 있는지에 대한 상세한 설명을 포함하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

양승엽님의 프로필 이미지
양승엽

작성한 질문수

질문하기