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

아더님의 프로필 이미지
아더

작성한 질문수

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

[빠짝스터디 1주차 과제] ARRAY, STRUCT 연습 문제 / PIVOT 연습 문제 / 퍼널 쿼리 연습 문제

작성

·

31

0

ARRAY, STRUCT 연습 문제

  1. 각 영화(title)별로 장르(genres)를 UNNEST해서 보여주세요.

SELECT
  title,
  genre
FROM advanced.array_exercises AS ae
CROSS JOIN UNNEST(genres) AS genre
  1. 각 영화(title)별 배우(actor)와 배역(character)을 보여주세요.(별도 칼럼)

SELECT
  title,
  actor.actor,
  actor.character
FROM advanced.array_exercises AS ae
CROSS JOIN UNNEST(actors) AS actor
  1. 각 영화(title)별로 배우(actor),배역(character),장르(genre)를 출력하세요.

SELECT 
  title,
  actor,
  character,
  genre
FROM advanced.array_exercises AS ae
CROSS JOIN UNNEST(actors) AS actor
CROSS JOIN UNNEST(genres) AS genre 
  1. 앱 로그 데이터(app_logs)의 배열을 풀어주세요.

SELECT 
  event_date,
  event_timestamp,
  event_name,
  user_pseudo_id,
  event_param.key AS key,
  event_param.value.string_value AS string_value,
  event_param.value.int_value AS int_value
FROM advanced.app_logs
CROSS JOIN UNNEST(event_params) AS event_param

PIVOT 연습 문제

  1. 유저(user_id)별로 주문 금액(amount)의 합계를 PIVOT (날짜를 행, user_id를 열)

SELECT
  order_date,
  SUM(IF(user_id = 1, amount, 0)) AS user_1,
  SUM(IF(user_id = 2, amount, 0)) AS user_2,
  SUM(IF(user_id = 3, amount, 0)) AS user_3
FROM advanced.orders
GROUP BY order_date
ORDER BY order_date
  1. 날짜별로 유저들의 주문금액의 합계를 PIVOT (user_id를 행, order_date를 열)

SELECT
  user_id,
  SUM(IF(order_date = '2023-05-01', amount, 0)) AS `2023-05-01`,
  SUM(IF(order_date = '2023-05-02', amount, 0)) AS `2023-05-02`,
  SUM(IF(order_date = '2023-05-03', amount, 0)) AS `2023-05-03`,
  SUM(IF(order_date = '2023-05-04', amount, 0)) AS `2023-05-04`,
  SUM(IF(order_date = '2023-05-05', amount, 0)) AS `2023-05-05`
FROM advanced.orders
GROUP BY user_id
ORDER BY user_id
  1. 사용자별, 날짜별로 주문이 있다면 1, 없다면 0으로 PIVOT 해주세요 (user_id를 행, order_date를 열)

SELECT
  user_id,
  IF(SUM(IF(order_date = '2023-05-01', amount, 0))>0,1,0) AS `2023-05-01`,
  IF(SUM(IF(order_date = '2023-05-02', amount, 0))>0,1,0) AS `2023-05-03`,
  IF(SUM(IF(order_date = '2023-05-03', amount, 0))>0,1,0) AS `2023-05-02`,
  IF(SUM(IF(order_date = '2023-05-04', amount, 0))>0,1,0) AS `2023-05-04`,
  IF(SUM(IF(order_date = '2023-05-05', amount, 0))>0,1,0) AS `2023-05-05`
FROM advanced.orders
GROUP BY user_id
ORDER BY user_id
  1. user_id = 32888이 카트 추가하기(click_cart)를 누를때 어떤 음식(food_id)을 담았나요?

SELECT 
  user_id,
  MAX(IF(event_param.key = 'firebase_screen',event_param.value.string_value,NULL)) AS firebase_screen,
  MAX(IF(event_param.key = 'food_id',event_param.value.int_value,NULL)) AS food_id
FROM advanced.app_logs
CROSS JOIN UNNEST(event_params) AS event_param
WHERE 
  user_id = 32888
  AND event_name = 'click_cart'
GROUP BY 
  user_id, event_timestamp

-- 카트에 담은 음식(food_id): 1559, 1942

퍼널 쿼리 연습 문제

일자별 이벤트 집계 후 PIVOT

WITH funnel_data AS (
  SELECT 
    *,
    CASE 
      WHEN event_name_with_screen = 'screen_view-welcome' THEN 1 
      WHEN event_name_with_screen = 'screen_view-home' THEN 2 
      WHEN event_name_with_screen = 'screen_view-food_category' THEN 3 
      WHEN event_name_with_screen = 'screen_view-restaurant' THEN 4 
      WHEN event_name_with_screen = 'screen_view-cart' THEN 5 
      WHEN event_name_with_screen = 'click_payment-cart' THEN 6 
    END AS step_number
  FROM (
    SELECT 
      event_date,
      event_timestamp,
      user_pseudo_id,
      concat(event_name, '-', event_param.value.string_value) AS event_name_with_screen
    FROM advanced.app_logs
    CROSS JOIN UNNEST(event_params) AS event_param
    WHERE event_param.key = 'firebase_screen'
  ) AS unnested_app_logs
  WHERE event_name_with_screen IN (
    'screen_view-welcome',
    'screen_view-home',
    'screen_view-food_category',
    'screen_view-restaurant',
    'screen_view-cart',
    'click_payment-cart'
  )
)SELECT 
  event_date,
  COUNT(IF(step_number = 1, user_pseudo_id, NULL)) AS `screen_view-welcome`,
  COUNT(IF(step_number = 2, user_pseudo_id, NULL)) AS `screen_view-home`,
  COUNT(IF(step_number = 3, user_pseudo_id, NULL)) AS `screen_view-food_category`,
  COUNT(IF(step_number = 4, user_pseudo_id, NULL)) AS `screen_view-restaurant`,
  COUNT(IF(step_number = 5, user_pseudo_id, NULL)) AS `screen_view-cart`,
  COUNT(IF(step_number = 6, user_pseudo_id, NULL)) AS `click_payment-cart`
FROM funnel_data
GROUP BY event_date
ORDER BY event_date

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 아더님.

BigQuery를 활용하여 SQL 쿼리를 구성하는 과정에서 ARRAY, STRUCT, PIVOT 및 퍼널 분석을 다루는 것은 매우 유익합니다. 아더님이 작성한 다양한 쿼리들, 특히 Array와 Struct의 사용법, PIVOT 테이블 구성, 퍼널 데이터 집계 등은 데이터 분석 능력을 강화하는 데 크게 기여할 것입니다.

질문하신 내용과 관련하여 아래 링크를 통해 더 깊이 있는 학습을 이어가실 수 있습니다. 이는 유사한 질문과 답변 사례로, SQL 쿼리 작성을 한층 더 발전시킬 수 있을 것입니다.

  1. 퍼널 SQL 쿼리 작성하기 - 오류 해결 사례

    • 이 게시물은 퍼널 쿼리를 작성하는 데 있어서의 오류와 해결 방법을 논의하고 있습니다. 퍼널 분석 문제 해결에 유용할 것입니다.
  2. SQL 활용 및 PIVOT에 관한 질의응답

    • PIVOT 테이블 사용에 관한 부분을 더 심도 깊게 다루고 있으며, 데이터 피벗 과정에서 유용한 힌트를 얻을 수 있습니다.
  3. BigQuery 퍼널별 유저 세션 시작 횟수 계산 - 윈도우 함수 응용

    • 퍼널별로 세션 시작을 계산하는 방법에 대해 설명하며, 쿼리 작성의 예시를 제공합니다.

이 자료들이 아더님의 학습에 큰 도움이 되길 바랍니다. 쿼리 작성 과정에서의 고민 거리나 오류 발생 시 참고하시면 더욱 효과적일 것입니다.

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

아더님의 프로필 이미지
아더

작성한 질문수

질문하기