작성
·
40
·
수정됨
0
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-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-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을 활용한 다양한 배열, 구조체, 피벗 테이블, 퍼널 쿼리 문제를 풀고 계시네요. 이 주제를 통한 학습은 데이터를 다루고 분석하는 데 매우 유익합니다. 질문 주신 내용에 대해 유사한 기존 답변을 찾아보았습니다. 유사한 문제를 해결하는 데 도움을 줄만한 링크들을 아래에 공유합니다:
퍼널 쿼리 작성에 오류가 있을 때: 퍼널 쿼리 작성 시 발생할 수 있는 흔한 오류들과 해결 방법에 대한 토론을 포함한 게시물이 있습니다. 이를 통해 동일한 유형의 문제를 해결하는 데 도움이 될 것입니다.
데이터의 피벗 및 UNNEST 기능 이해: BigQuery에서 ARRAY나 STRUCT 데이터를 효과적으로 처리하는 방법에 대해 자세히 설명된 게시물을 참고하세요.
퍼널 분석을 위한 쿼리 작성 연습: 퍼널에 기반한 다양한 쿼리 작성 방법에 대해 다른 학습자의 의견과 피드백을 살펴보세요.
위에서 말씀드린 자료들이 케이든님의 학습에 도움이 되길 바랍니다. 각 링크에서는 데이터 분석을 위한 쿼리 작성 시 자주 발생하는 문제들에 대한 상세한 설명과 해결 방안이 포함되어 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.