강의

멘토링

로드맵

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

권혁범님의 프로필 이미지
권혁범

작성한 질문수

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

작성

·

58

0

1. ARRAY, STRUCT 연습문제

문제 1)

SELECT
  movie_id,
  title,
  genre

FROM advanced.array_exercises
CROSS JOIN UNNEST(genres) AS genre;

문제 2)

SELECT
  title,
  aa.actor,
  aa.character

FROM advanced.array_exercises AS ae
CROSS JOIN UNNEST(actors) AS aa;

문제 3)

SELECT
  title,
  aa.actor,
  aa.character,
  gg AS genre

FROM advanced.array_exercises AS ae
CROSS JOIN UNNEST(actors) AS aa
CROSS JOIN UNNEST(genres) AS gg;

문제 4)

SELECT 
  user_id,
  event_date,
  event_name,
  user_pseudo_id,
  event_param.key,
  event_param.value.string_value,
  event_param.value.int_value

FROM `advanced.app_logs`
CROSS JOIN UNNEST(event_params) AS event_param;

 

2. PIVOT 연습문제

문제 1)

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 )

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 ALL
ORDER BY user_id

문제 3)

SELECT
  user_id,
  MAX(IF(order_date = '2023-05-01' AND order_id is not null, 1, 0)) AS `2023-05-01`,
  MAX(IF(order_date = '2023-05-02' AND order_id is not null, 1, 0)) AS `2023-05-02`,
  MAX(IF(order_date = '2023-05-03' AND order_id is not null, 1, 0)) AS `2023-05-03`,
  MAX(IF(order_date = '2023-05-04' AND order_id is not null, 1, 0)) AS `2023-05-04`,
  MAX(IF(order_date = '2023-05-05' AND order_id is not null, 1, 0)) AS `2023-05-05`,

FROM advanced.orders

GROUP BY user_id
ORDER BY user_id;

문제 4)

WITH app_order_raw AS (
SELECT
  user_id,
  event_date,
  event_name,
  user_pseudo_id,
  pr.key,
  pr.value.string_value,
  pr.value.int_value

FROM advanced.app_logs, UNNEST(event_params) AS pr
WHERE event_date = '2022-08-01'
)

SELECT
  user_id,
  event_date,
  event_name,
  user_pseudo_id,
  MAX(IF(key = 'firebase_screen', string_value, null)) AS firebase_screen,
  MAX(IF(key = 'food_id', int_value, null)) AS food_id,
  MAX(IF(key = 'session_id', string_value, null)) AS session_id,

FROM app_order_raw
GROUP BY user_id, event_date, event_name, user_pseudo_id;

3. 퍼널 연습문제

WITH base AS (
  SELECT
    event_date,
    event_timestamp,
    event_name,
    user_id,
    user_pseudo_id,
    platform,
    -- event_param
    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
    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
ORDER BY 1, 3


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 main
GROUP BY ALL
ORDER BY
  all;

답변 1

0

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

권혁범님께서 제공해주신 SQL 문제들은 ARRAY, STRUCT, PIVOT 및 퍼널 분석 관련 쿼리를 연습하는 내용입니다. 각 문제는 다양한 데이터 조작과 응용을 요구하여 빅데이터 분석 또는 데이터베이스 관리에서 자주 사용되는 패턴과 유사합니다.

  1. ARRAY 및 STRUCT 연습: ARRAY 및 STRUCT 데이터 타입을 활용한 쿼리로, UNNEST 함수를 활용하여 여러 값을 분리하고 크로스 조인하는 방식이 주를 이루고 있습니다.

  2. PIVOT 연습: 특정 조건에 맞춰 데이터를 회전하여 요약하는 방법으로 구현되었습니다. 특히, SUM과 IF 조건문을 조합하여 사용자의 결제 금액이나 주문 건수를 날짜별로 정리하는 패턴을 볼 수 있습니다.

  3. 퍼널 분석 연습: 사용자의 이벤트 행동을 추적하고 단계별로 변환 속도를 분석하는 퍼널 쿼리는 마케팅 분석 등에서 자주 사용됩니다. WITH 절을 이용한 서브쿼리에 기반한 계층적 쿼리 구조가 특징입니다.

이와 관련된 SQL 사용법을 더 배우기 원하신다면, SQL 관련 강의나 자료를 통해 기본 개념 및 실습을 통해 익혀 보시는 것을 추천드립니다. 강의 자료는 인프런 입문강의 추천받기를 통해 찾아볼 수 있습니다.

추가적인 질문이 있다면 언제든지 알려주세요!

권혁범님의 프로필 이미지
권혁범

작성한 질문수

질문하기