작성
·
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 기능을 활용하는 예제들로 구성되어 있어요. 몇 가지 코멘트를 드릴게요:
ARRAY, STRUCT 사용법
UNNEST
를 통해 배열 요소를 각각의 행으로 변환해서 사용하셨습니다. 이는 배열 내부 데이터를 개별적으로 처리하거나 조회할 때 유용합니다.CROSS JOIN UNNEST
를 이용해 다중 레코드와 연결된 배열 요소를 적절히 처리하셨습니다.PIVOT 쿼리 방법
SUM(IF())
를 많이 활용하신 점이 인상적입니다. 그중에서 SQL 쿼리 #2 부분에서 2023-05-05
가 중복된 부분은 오타로 보입니다.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)
를 참조해 주세요.