inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

120

지용

작성한 질문수 3

0

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

연습문제1

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

연습문제2

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

연습문제3

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

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

연습문제2

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

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

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
; 

퍼널 분석

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
;

 

 

 

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

인프런 AI 인턴

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

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

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

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

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

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

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

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

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

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

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

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

최종 과제 제출

0

82

3

BigQuery 활용편 18강 질문있습니다!

0

84

1

리텐션 공부하다가 궁금한게 생겨 질문드립니다

0

83

2

안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다

0

75

2

biquery 테이블 생성 오류 이슈

0

55

2

동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다

0

73

2

[과제] 퍼널 PIVOT 테이블 작성하기

0

67

2

array 등

0

63

2

N day 리텐션 쿼리 관련 질문

0

63

2

이동평균 계산 시 order by 기본값은 뭔가요?

0

69

2

윈도우 연습문제 1번 질문

0

65

1

user_id에 NULL이 나오는데 정상인가요?

0

72

2

3-13 리텐션 과제 제출

0

94

2

최종 과제 제출

0

130

3

weekly retention 구하기 과제

0

90

2

1-9. 피벗 쿼리 작성

0

81

2

app_logs 테이블 생성 문제

0

73

2

Weekly Retention 구하기 완성하였습니다.

0

77

2

[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료

0

106

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

92

2

정성 데이터 분석 방법 문의

0

165

1

최종 과제 제출

0

108

3

1-6 예시 문제 풀이

0

69

2

최종과제 제출

0

145

2