작성
·
23
·
수정됨
0
시간관리의 실패로 퀄리티있는 학습을 못 한 것 같습니다. 과제 제출 시간 이후에 복습하며 다시 꼼꼼하게 살피겠습니다!
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'] )
array_exercises 테이블에서 각 영화(title)별로 장르(genres)를 UNNEST해서 보여주세요.
SELECT
title,
genre
FROM `advanced.array_exercises`
CROSS JOIN UNNEST(genres) AS genre
array_exercises 테이블에서 각 영화(title)별로 배우(actor)와 배역(character)을 보여주세요. 배우와 배역은 별도의 컬럼으로 나와야 합니다.
SELECT
title, actor.actor, actor.character
FROM `advanced.array_exercises`,
UNNEST(actors) as actor
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
앱 로그 데이터(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
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
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
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
앱 로그 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
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님의 스터디에 도움이 되길 바랍니다:
퍼널별 유저들의 새로운 세션 시작 횟수의 총합 _ 윈도우 함수 응용
이 자료들이 도움이 되기를 바라며, 각 자료는 어떻게 데이터 분석을 향상시킬 수 있을지에 대한 힌트를 줄 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.