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

Lee Jae-Baek님의 프로필 이미지
Lee Jae-Baek

작성한 질문수

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

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

작성

·

23

·

수정됨

0

시간관리의 실패로 퀄리티있는 학습을 못 한 것 같습니다. 과제 제출 시간 이후에 복습하며 다시 꼼꼼하게 살피겠습니다!



ARRAY, STRUCT

CREATE OR REPLACE TABLE advanced.array_exercises AS SELECT movie_id, title, actors, genres
FROM (
SELECT
1 AS movie_id,
'Avengers: Endgame' AS title, ARRAY<STRUCT<actor STRING, character STRING>>[
STRUCT('Robert Downey Jr.', 'Tony Stark'),
STRUCT('Chris Evans', 'Steve Rogers')
] AS actors,
ARRAY<STRING>['Action', 'Adventure', 'Drama'] AS genres
UNION ALL SELECT
2,
'Inception',
ARRAY<STRUCT<actor STRING, character STRING>>[
STRUCT('Leonardo DiCaprio', 'Cobb'),
STRUCT('Joseph Gordon-Levitt', 'Arthur') ],
ARRAY<STRING>['Action', 'Adventure', 'Sci-Fi'] UNION ALL
SELECT
3,
'The Dark Knight',
ARRAY<STRUCT<actor STRING, character STRING>>[
STRUCT('Christian Bale', 'Bruce Wayne'),
STRUCT('Heath Ledger', 'Joker') ],
ARRAY<STRING>['Action', 'Crime', 'Drama'] )
  1. array_exercises 테이블에서 각 영화(title)별로 장르(genres)를 UNNEST해서 보여주세요.

SELECT 
	title, 
	genre
FROM `advanced.array_exercises`
CROSS JOIN UNNEST(genres) AS genre
  1. array_exercises 테이블에서 각 영화(title)별로 배우(actor)와 배역(character)을 보여주세요. 배우와 배역은 별도의 컬럼으로 나와야 합니다.

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

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

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

PIVOT

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

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
  1. 앱 로그 PIVOT

WITH base AS (
  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 = "sesstion_id", param.value.string_value, NULL)) AS sesstion_id
  FROM `advanced.app_logs`
  CROSS JOIN UNNEST(event_params) AS param
  WHERE event_date = "2022-08-01"
  GROUP BY ALL
)

SELECT
  event_date,
  COUNT(user_id) AS user_cnt
FROM base
WHERE
  event_name = "click_cart"
GROUP BY event_date

Funnel

WITH base AS (
  SELECT
    event_date,
    event_timestamp,
    event_name,
    user_id,
    user_pseudo_id,
    platform,
    MAX(IF(event_param.key = "firebase_screen", event_param.value.string_value, NULL)) AS firebase_screen,
    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
    event_date BETWEEN "2022-08-01" AND "2022-08-18"
  GROUP BY ALL
), filter_event_and_concat_event_and_screen AS (
  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
    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_and_concat_event_and_screen
GROUP BY ALL
HAVING step_number IS NOT NULL

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. Lee Jae-Baek님.

BigQuery를 활용한 ARRAY, STRUCT, PIVOT, 퍼널 쿼리 연습 문제에 대한 질문을 주셨네요. 이와 관련된 유사한 내용이나 해결 방법을 찾는 것은 신중한 작업입니다. 현재 강의 내용에 대해 구체적으로 어떤 점에서 도움이 필요한지를 더 알아야 구체적으로 도움을 드릴 수 있습니다. 하지만 기본적으로 관련된 기존 자료들을 아래에 안내드리겠습니다.

이 문제와 관련하여 퍼널 분석 및 PIVOT의 사용법을 설명한 게시물이 있습니다. 이 자료들이 Lee Jae-Baek님의 스터디에 도움이 되길 바랍니다:

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

    • 퍼널 분석을 위한 SQL 쿼리 작성 과정에서 발생할 수 있는 일반적인 문제와 그 해결 방법을 다루고 있습니다. 이 과정을 통해 쿼리의 로직을 이해하는데 도움이 될 수 있습니다. 특히, CASE 문을 이용한 조건 처리 및 데이터 그룹화와 관련이 있습니다.
  2. 과제: 퍼널 쿼리(피벗테이블 적용) 작성

    • PIVOT 테이블을 활용하여 다양한 방식으로 데이터를 시각화하는 연습 문제를 포함하고 있습니다. 경우에 따라서 유저별, 날짜별로 데이터를 다르게 그룹화해야 하는 부분에 도움이 됩니다.
  3. 퍼널별 유저들의 새로운 세션 시작 횟수의 총합 _ 윈도우 함수 응용

    • 퍼널별 유저의 세션 데이터를 쿼리하는 과정을 다루며, LAG(), ROW_NUMBER() 등의 윈도우 함수를 활용하여 데이터를 분석하는 방법을 설명합니다. 이러한 함수 사용법을 통해 더 복잡한 쿼리를 작성하는 데에 도움이 됩니다.

이 자료들이 도움이 되기를 바라며, 각 자료는 어떻게 데이터 분석을 향상시킬 수 있을지에 대한 힌트를 줄 수 있을 것입니다.

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

Lee Jae-Baek님의 프로필 이미지
Lee Jae-Baek

작성한 질문수

질문하기