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

케이든님의 프로필 이미지
케이든

작성한 질문수

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

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

작성

·

40

·

수정됨

0

연습 문제

(1) ARRAY, STRUCT 연습문제

1-1.

--1-1) array_exercises 테이블에서 각 영화(title)별로 장르(genres)를 UNNEST해서 보여주세요.
SELECT title
     , genre
  FROM advanced.array_exercises
     , unnest(genres) as genre

1-2.

--1-2) array_exercises 테이블에서 각 영화(title)별로 배우(actor)와 배역(character)을 보여주세요. 배우와 배역은 별도의 컬럼으로 나와야 합니다.
select title
     , actor.actor
     , actor.character     
  from advanced.array_exercises
     , unnest(actors) as actor  

1-3.

--1-3) array_exercises 테이블에서 각 영화(title)별로 배우(actor), 배역(character), 장르(genre)를 출력하세요. 한 Row에 배우, 배역, 장르가 모두 표시되어야 합니다.
select title
     , actor.actor as actor
     , actor.character as character
     , genre 
  from advanced.array_exercises
     , unnest(actors) as actor
     , unnest(genres) as genre 

1-4.

--1-4) 앱 로그 데이터(app_logs)의 배열을 풀어주세요
select user_id
     , event_date
     , event_name
     , user_pseudo_id
     , param.key as key
     , param.value.string_value as string_value
     , param.value.int_value as int_value
  from advanced.app_logs
     , unnest(event_params) as param     
 where event_date = '2022-08-01'

 

(2) PIVOT 연습문제

2-1.

--2-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 order_date

2-2.

--2-2) orders 테이블에서 날짜(order_date)별로 유저들의 주문 금액(amount)의 합계를 PIVOT 해주세요. user_id를 행(Row)으로, order_date를 열(Column)으로 만들어야 합니다.
select user_id
     , max(if(order_date = '2023-05-01',amount,0)) as `2023-05-01`
     , max(if(order_date = '2023-05-02',amount,0)) as `2023-05-02`
     , max(if(order_date = '2023-05-03',amount,0)) as `2023-05-03`
     , max(if(order_date = '2023-05-04',amount,0)) as `2023-05-04`
     , max(if(order_date = '2023-05-05',amount,0)) as `2023-05-05`
  from advanced.orders
 group by user_id
 order by user_id

2-3.

--2-3) orders 테이블에서 사용자별, 날짜별로 주문이 있따면 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 user_id

2-4.

--2-4) 앱 로그 데이터 배열 PIVOT 하기
select user_id
     , event_date
     , event_name
     , 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.int_value, null)) as food_id
     , max(if(param.key = 'session_id', param.value.string_value, null)) as session_id
  from advanced.app_logs
     , unnest(event_params) as param
 where event_date = '2022-08-01'
 group by all 

 

(3) 퍼널 연습문제

3-1.

--3-1) 퍼널 별 유저 수 집계(일자별)
with base as
(
  select event_date     
       , event_name
       , event_timestamp     
       , user_id
       , user_pseudo_id
       , platform
       , max(if(param.key = 'firebase_screen', param.value.string_value, null)) as firebase_screen
    from advanced.app_logs
       , unnest(event_params) as param
   where event_date between '2022-08-01' and '2022-08-18'
   group by all
),
filter_event as 
(
  select 
    * except(event_name, firebase_screen)
    , concat(event_name, "-", firebase_screen) as event_name_with_screen      
    from base    
  where event_name in ('screen_view', 'click_payment')
)
select 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
 group by all
 having step_number is not null
 order by event_date

3-2.

--3-2) 퍼널 별 유저 수 집계 PIVOT
with base as
(
  select event_date     
       , event_name
       , event_timestamp     
       , user_id
       , user_pseudo_id
       , platform
       , max(if(param.key = 'firebase_screen', param.value.string_value, null)) as firebase_screen
    from advanced.app_logs
       , unnest(event_params) as param
   where event_date between '2022-08-01' and '2022-08-18'
   group by all
),
filter_event as 
(
  select 
    * except(event_name, firebase_screen)
    , concat(event_name, "-", firebase_screen) as event_name_with_screen      
    from base    
  where event_name in ('screen_view', 'click_payment')
),
daily_group as
(
select 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
 group by all
 having step_number is not null
 order by event_date
)
select event_date
     , max(if(event_name_with_screen = 'screen_view-welcome',cnt,null)) as screen_view_welcome
     , max(if(event_name_with_screen = 'screen_view-home',cnt,null)) as screen_view_home
     , max(if(event_name_with_screen = 'screen_view-food_category',cnt,null)) as screen_view_food_category
     , max(if(event_name_with_screen = 'screen_view-restaurant',cnt,null)) as screen_view_restaurant
     , max(if(event_name_with_screen = 'screen_view-cart',cnt,null)) as screen_view_cart
     , max(if(event_name_with_screen = 'click_payment-cart',cnt,null)) as click_payment_cart
  from daily_group
 group by all
 order by event_date

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 케이든님.

BigQuery와 SQL을 활용한 다양한 배열, 구조체, 피벗 테이블, 퍼널 쿼리 문제를 풀고 계시네요. 이 주제를 통한 학습은 데이터를 다루고 분석하는 데 매우 유익합니다. 질문 주신 내용에 대해 유사한 기존 답변을 찾아보았습니다. 유사한 문제를 해결하는 데 도움을 줄만한 링크들을 아래에 공유합니다:

  1. 퍼널 쿼리 작성에 오류가 있을 때: 퍼널 쿼리 작성 시 발생할 수 있는 흔한 오류들과 해결 방법에 대한 토론을 포함한 게시물이 있습니다. 이를 통해 동일한 유형의 문제를 해결하는 데 도움이 될 것입니다.

  2. 데이터의 피벗 및 UNNEST 기능 이해: BigQuery에서 ARRAY나 STRUCT 데이터를 효과적으로 처리하는 방법에 대해 자세히 설명된 게시물을 참고하세요.

  3. 퍼널 분석을 위한 쿼리 작성 연습: 퍼널에 기반한 다양한 쿼리 작성 방법에 대해 다른 학습자의 의견과 피드백을 살펴보세요.

위에서 말씀드린 자료들이 케이든님의 학습에 도움이 되길 바랍니다. 각 링크에서는 데이터 분석을 위한 쿼리 작성 시 자주 발생하는 문제들에 대한 상세한 설명과 해결 방안이 포함되어 있습니다.

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

케이든님의 프로필 이미지
케이든

작성한 질문수

질문하기