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

지용님의 프로필 이미지
지용

작성한 질문수

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

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

작성

·

41

·

수정됨

0

1-4. Array, Struct 연습문제 (1~4번)

연습문제1

  • 문제

    • array_exercises 테이블에서 각 영화(title)별로 장르(genres)를 UNNEST해서 보여주세요

       

  • 쿼리

select 
  title,
  genres2
from advanced.array_exercises
cross join unnest(genres) as genres2
;
  • 결과

     

연습문제2

  • 문제

    • array_exercises 테이블에서 각 영화(title)별로 배우(actor)와 배역(character)을 보여주세요. 배우와 배역은 별도의 컬럼으로 나와야 합니다

  • 쿼리

select 
  title,
  actor.actor,
  actor.character
from advanced.array_exercises
cross join unnest(actors) as actor
order by movie_id
;
  • 결과

     

연습문제3

  • 문제

    • array_exercises 테이블에서 각 영화(title)별로 배우(actor), 배역(character), 장르 (genre)를 출력하세요. 한 Row에 배우, 배역, 장르가 모두 표시되어야 합니다

  • 쿼리

select 
  title, 
  actor.actor,
  actor.character
  genre2 # array<string>
from advanced.array_exercises
cross join unnest (actors) as actor
cross join unnest (genres) as genre
order by movie_id
;
  • 결과

 

연습문제4

  • 문제

    • 앱 로그 데이터(app_logs)의 배열을 풀어주세요

  • 쿼리

select 
  user_id,
  event_date,
  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
where event_date = "2022-08-01"
limit 10
;
  • 결과

     

1-9. 퍼널 SQL 쿼리 작성하기

연습문제1

  • 문제

    • orders 테이블에서 유저(user_id)별로 주문 금액(amount)의 합계를 PIVOT해주세요. 날짜(order_date)를 행(Row)으로, user_id를 열(Column)으로 만들어야 합니다

  • 쿼리

    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 1 
    ;
  • 결과

연습문제2

  • 문제

    • orders 테이블에서 날짜(order_date)별로 유저들의 주문 금액(amount)의 합계를 PIVOT 해주세요. user_id를 행(Row)으로, order_date를 열(Column)으로 만들어야 합니다

  • 쿼리

select 
  user_id,
  # 컬럼의 이름을 지정할때, 영어를 제외하고 backtick(`)사용 
  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 1 
;
  • 결과

연습문제3

  • 문제

    • orders 테이블에서 사용자(user_id)별, 날짜(order_date)별로 주문이 있다면 1, 없다면 0으로 PIVOT 해주세요. user_id를 행(Row)으로, order_date를 열(Column)로 만들고 주문을 많이 해도 1로 처리합니다

  • 쿼리

select 
  user_id,
  max(if(order_date = "2023-05-01", 1, 0)) as `2023-05-01`,
  max(if(order_date = "2023-05-02", 1, 0)) as `2023-05-02`,
  max(if(order_date = "2023-05-03", 1, 0)) as `2023-05-03`,
  max(if(order_date = "2023-05-04", 1, 0)) as `2023-05-04`,
  max(if(order_date = "2023-05-05", 1, 0)) as `2023-05-05`
from advanced.orders
group by user_id
order by 1 
;
  • 결과

연습문제4

  • 문제

    • 앱 로그 데이터 배열 PIVOT하기 - user_id = 32888이 카트 추가하기(click_cart)를 누를때 어떤 음식(food_id)을 담았나요?

  • 쿼리

select 
  event_date,
  event_timestamp,
  event_name,
  user_id,
  user_pseudo_id,
  max(if(param.key = 'firebase_screen', param.value.string_value, null)) as firebase_screen,
  -- max(if(param.key = 'food_id', param.value.string_value, null)) as food_id,
  max(if(param.key = 'food_id', param.value.int_value, null)) as food_id,  
  max(if(param.key = 'session_id', param.value.string_value, null)) as session_id  


from advanced.app_logs
cross join unnest(event_params) as param
where event_date = "2022-08-01" and user_id = 32888 and event_name = "click_cart"
group by all
limit 100
; 
  • 결과

퍼널 분석

  • 문제

    • step_number별 count, 일자별 퍼널별 유저 수 쿼리

  • 쿼리

with base as (select 
    event_date,
    event_timestamp,
    event_name,
    user_id,
    user_pseudo_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,  
    max(if(event_param.key = 'session_id', event_param.value.string_value, null)) as session_id  
  from advanced.app_logs
  cross join unnest(event_params) as event_param
  where 1=1
    and event_date between "2022-08-01" and "2022-08-18"
  group by all
  ), filter_event_and_concat_event_and_acreen AS (
  -- event_name + screen
  select 
    * except(event_name, firebase_screen, event_timestamp), 
    concat(event_name, "-", firebase_screen) as event_name_with_screen,
    datetime(timestamp_micros(event_timestamp), "Asia/Seoul") as event_datetime
  from base
  where 1=1
    and event_name in ("screen_view", "click_payment"))

# 일자별로 퍼널별 유저 수
select 
  -- distinct(event_name_with_screen)
  event_date,
  event_name_with_screen,
  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
    else null
    end as step_number,
    count(distinct user_pseudo_id) as cnt

from filter_event_and_concat_event_and_acreen
group by all
having step_number is not null
order by event_date
;
  • 결과 

 

 

 

답변 1

0

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

SQL에서는 ARRAY와 STRUCT 활용 및 PIVOT 기능 사용이 데이터 분석에서 중요한 스킬입니다. 이번에 질문하신 여러 연습문제에 대한 설명을 드리자면 다음과 같습니다. 문제의 핵심과 각 쿼리가 어떤 결과를 출력하는지에 대해 간단히 설명하겠습니다.

  1. ARRAY UNNEST 예제
    • 각 영화의 장르를 UNNEST해서 보여주는 쿼리는 ARRAY 타입의 데이터를 개별 행으로 분해하여 데이터의 분석을 쉽게 만들어 줍니다.

관련된 질문에 대해서는 이쪽 링크에서 참고할 수 있습니다:
- BigQuery에서 ARRAY UNNEST 기능 사용법

  1. 배우와 배역의 배열 처리
    • 배우와 배역 정보가 들어있는 ARRAY STRUCT 데이터를 별도로 UNNEST하여 각 컬럼에 배치하면, 영화의 주연 배우와 그 역할을 쉽게 파악할 수 있습니다.

유사한 해답을 제공하는 질문:
- ARRAY STRUCT를 사용한 데이터 처리 방법

  1. 배우, 배역, 장르 조합
    • 각 영화에 대한 배우, 배역, 그리고 장르를 한 행으로 나타내면, 복잡한 데이터 세트를 단순화하는 데 도움이 됩니다. 이 과정에서는 UNNEST 연산을 두 번 사용하여 원하는 형태로 데이터를 변환합니다.

참고할 만한 자료:
- 복합 ARRAY 구조를 가진 데이터의 해체

  1. 앱 로그 데이터 배열과 피벗테이블
    • 다양한 이벤트 로그의 배열 데이터를 피벗하여 중요한 정보 추출 및 가시화하는 과정에서는, 데이터의 구조를 이해하고 적절히 변형 및 집계하는 것이 핵심입니다.

유사한 질문 링크:
- 데이터 구조 파악 및 피벗테이블 작성 방법

위의 답변들이 지용님의 문제 해결에 도움이 되기를 바라며, 만약 추가적인 도움이 필요하시다면, 직접 질문을 남기시면 곧 지식공유자께서 더욱 세부적으로 설명해 주실 것입니다.

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

지용님의 프로필 이미지
지용

작성한 질문수

질문하기