강의

멘토링

로드맵

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

Je Ho님의 프로필 이미지
Je Ho

작성한 질문수

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

작성

·

71

0

ARRAY, STRUCT 연습문제

--#1
SELECT
  title,
  genre
FROM `advanced.array_exercises`
CROSS JOIN UNNEST(genres) AS genre;

--#2
SELECT
  title,
  actor_info.actor as actor,
  actor_info.character as character
FROM `advanced.array_exercises`
CROSS JOIN UNNEST(actors) as actor_info;

--#3
SELECT
  title,
  actor_info.actor as actor,
  actor_info.character as character,
  genre
FROM `advanced.array_exercises`
CROSS JOIN UNNEST(actors) as actor_info
CROSS JOIN UNNEST(genres) as genre;


--#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;

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-05`,
  SUM(IF(order_date="2023-05-04",amount,0)) AS `2023-05-05`,
FROM advanced.orders
GROUP BY user_id
ORDER BY user_id;

#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 user_id;

#4
SELECT 
  user_id
 ,event_date
 ,event_name
 ,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 event_name = "click_cart"
       AND event_date = "2022-08-01"
       AND user_id = 32888
 GROUP BY user_id,event_date,event_name,user_pseudo_id

FUNNEL 연습문제

WITH base_tab AS (
  SELECT 
    event_date,
    event_name,
    user_id,
    user_pseudo_id,
    event_timestamp,
    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_tab 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_tab
  WHERE
    event_name IN ('screen_view','click_payment')
),
event_cnt 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_tab
  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 event_cnt 
GROUP BY ALL 
ORDER BY event_date

답변 1

0

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

Je Ho님, SQL 연습 문제를 잘 풀어보셨네요. 작성하신 쿼리를 보면 ARRAY, STRUCT, PIVOT, FUNNEL 등 다양한 SQL 기능을 활용하는 예제들로 구성되어 있어요. 몇 가지 코멘트를 드릴게요:

  1. ARRAY, STRUCT 사용법

    • ARRAY와 STRUCT 데이터를 UNNEST를 통해 배열 요소를 각각의 행으로 변환해서 사용하셨습니다. 이는 배열 내부 데이터를 개별적으로 처리하거나 조회할 때 유용합니다.
    • 특히 CROSS JOIN UNNEST를 이용해 다중 레코드와 연결된 배열 요소를 적절히 처리하셨습니다.
  2. PIVOT 쿼리 방법

    • PIVOT 쿼리를 통해 데이터 테이블을 가로 방향으로 변환하여, 특정 필드 값을 기준으로 합계 및 최대값 등의 통계를 구하셨습니다. SUM(IF())를 많이 활용하신 점이 인상적입니다. 그중에서 SQL 쿼리 #2 부분에서 2023-05-05가 중복된 부분은 오타로 보입니다.
  3. FUNNEL 분석 쿼리

    • FUNNEL 분석 쿼리에서는 여러 이벤트 단계별 사용자의 수를 카운트하는 방법을 보여주셨습니다. 여기서는 CASE 문을 사용해 각 이벤트 단계에 번호를 매기고, CONCAT 함수로 이벤트와 화면 정보를 결합하여 이벤트가 발생한 화면별로 분석하였습니다.

위 설명이 Je Ho님께 도움이 되셨으면 좋겠습니다. 더 궁금한 점이나 코멘트가 필요하시면 언제든지 말씀해 주세요!

이미지를 클릭해 좀 더 많은 정보를 얻고 싶으시면 [Spring Data JDBC - Reference Documentation v3.1.5](https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#jdbc.query-methods)를 참조해 주세요.

Je Ho님의 프로필 이미지
Je Ho

작성한 질문수

질문하기