묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨초보자를 위한 BigQuery(SQL) 입문
4-5. 3번 문제 질
안녕하세요, 카일스쿨님 강의 너무 잘 듣고 있습니다.trainer_id 별로 결과값을 보고싶은데 오류가 해결되질 않아서 질문 남깁니다. 서브쿼리로 작성했기 때문에 trainer_id 별로 확인할 수가 없는 걸까요?
-
해결됨초보자를 위한 BigQuery(SQL) 입문
JOIN 1번 문제
안녕하세요JOIN 연습문제 1번에 대해서 질문이 있습니다SELETkor_name,COUNT(tp.id) AS pokemon_cnt 와SELETkor_name,COUNT(p.id) AS pokemon_cnt출력되는 행의 개수는 똑같은데 tp.id 를 쓰는 것과 p.id를 쓸 때 해석 차이가 무엇인지,연습 문제가 아닌 실무에서 똑같은 상황일 때 p.id를 사용하면 어떤 문제가 발생하는지,연습 문제처럼 COUNT로 집계 할 때 보통 어떤 테이블의 id를 COUNT 하는 것이 보편적인지 궁금합니다. SELECT kor_name, COUNT(tp.id) AS pokemon_cnt FROM( SELECT id, trainer_id, pokemon_id, status FROM basic.trainer_pokemon WHERE status IN("Active","Training") ) AS tp LEFT JOIN basic.pokemon AS p ON tp.pokemon_id = p.id GROUP BY kor_name ORDER BY 2 DESC
-
해결됨초보자를 위한 BigQuery(SQL) 입문
battle 테이블 생성 시 생성 오류
안녕하세요. 제가 중간에 수업을 수강하다 개인적인 사정으로 못듣고있었어서 다시 테이블 설정이 필요해서 하고있습니다. 다만 battle 테이블 생성시 다음과 같은 오류가 떠 생성이 안되는 것 같은데 처리 방법이 어떤것인가요? ㅠㅠ 감사합니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
5-6. 4번 문제 WHERE 조건의 위치 문의
안녕하세요.이전 질문에 대한 답변 감사합니다. type1을 기준으로 해서 4번 문제를 풀었는데요. 저는 trainer 테이블을 기준으로는 achivement_level = "Master"라는 조건이 있고,trainer_pokemon 테이블에서는 status IN ("Active", "Training")이라는 조건이 있으니먼저 두 테이블을 이렇게 가공한 후에 JOIN하면 좋지 않을까? 라는 생각으로 아래와 같이 쿼리를 작성했어요.SELECT p.type1, COUNT(tp.id) type_cnt FROM (SELECT * FROM basic.trainer WHERE achievement_level = "Master") t LEFT JOIN (SELECT * FROM `basic.trainer_pokemon` WHERE status IN ("Active", "Training")) tp ON t.id = tp.trainer_id LEFT JOIN `basic.pokemon` p ON tp.pokemon_id = p.id GROUP BY p.type1 ORDER BY type_cnt DESC LIMIT 1 그런데 풀이에서는 trainer_pokemon 테이블만 status 기준으로 가공한 후, 나머지 테이블을 JOIN하고 -> 마지막에 WHERE 조건으로 achivement_level = "Master" 를 걸어서 데이터를 추리는 것 같더라고요.현재 데이터 기준으로는 일단 값이 같지만, 뭔가 이 선후관계에 따라서 무언가가 달라질 수도 있을 것 같은데 명확하게 알기가 어려워 질문 드립니다! 확인 부탁 드립니다 :)
-
해결됨초보자를 위한 BigQuery(SQL) 입문
5-6. 연습문제 4번, type2에 대해서는 고려하지 않아도 될까요?
안녕하세요.5-6. JOIN 연습문제 4번을 풀 때, pokemon 테이블에 type1도 있고, type2도 있는데 문제에서는 특정 하나를 사용하라고 되어있지 않아서 고민을 많이 했는데요. (type1 + type2 된 컬럼이 존재하는 새 테이블을 만들 수 있나? 까지 생각이 나아갔습니다...)풀이를 보니, type1만 사용된 것 같아서요!type1과 type2가 모두 존재하는 포켓몬도 있어서, 이런 경우에 대한 대응은 어떻게 되는지 궁금합니다. type1이면서 type2인 포켓몬의 type1+type2 타입을 구하기 (ex.Grass&Poison)type1과 type2를 합집합으로 생각했을 때, 그 중에서 가장 많은 포켓몬 타입을 구하기type1만 있거나, type2만 있거나, type1/2 모두 있는 케이스를 고려하여 특정 유의미한 데이터를 구하기등의 다양한 요구 케이스가 발생할 수 있을 것 같아서요! 확인 부탁 드립니다 :)
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
BigQuery 활용편 18강 질문있습니다!
안녕하세요 카일스쿨님!BigQuery 기초편부터 활용편까지 유익하게 수강 중인 학생입니다 🙂 BigQuery 활용편 18강 "연결된 시트에서 매개 변수 사용하기" 부분에서 질문이 있습니다!스샷 왼쪽(강의창)에서 선택하신 데이터 범위가 오른쪽(제 구글 시트 창)의 어떤 셀에 해당하는지제가 잘 이해하지 못해서, 혹시 알려주실 수 있을까요~?기술적인 내용이라 여쭤보기 민망하고 죄송스럽지만 가장 정확하게 답을 얻을 수 있을 것 같아 질문드립니다! 추신__ 에어팟 맥스처럼 귀에 챠악 감기는 강의 항상 감사합니당
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
리텐션 공부하다가 궁금한게 생겨 질문드립니다
-- Weekly 리텐션 -- 핵심 : event_date => event_week으로 변경하면 됨 -- 2024-06-30(일) => 2024년 26주차. 2024-06-24(월)도 같은 26주차 -- 데이터를 전처리(가공)하기 위해서 WEEK 함수를 사용할 수도 있고, DATE_TRUNC(일자, 자를 기준) -- DATE_TRUNC : 2024-06-30 => 2024-06-24 -- WEEK : 26. 2024년 26주차! 주차 별 date를 직관적으로 알기 어렵다고 생각하는 편(개인 생각) -- (깨알 지식) WEEK vs ISO_WEEK -- 주 번호를 계산할 때 사용할 수 있는 함수 -- WEEK : 일요일이 주의 첫 날로 간주. 1월 1일이 속한 주가 1주차 -- ISO_WEEK : 월요일이 주의 첫 날로 간주. ISO 8601 국제 표준에 따라 정의. 목요일이 속한 주를 기준으로 주 번호를 지정 -- 목요일이 속하면 그 주의 4일 이상이 포함되기 때문 -- 연도의 첫 목요일이 있는 주부터 1주차 -- 2022년 1월 1일(토요일) WEEK : 2022년 1주차. ISO_WEEK 2021년 52주차. -- 첫 목요일은 2022-01-06. 2022-01-03~2022-01-09가 2022년 1주차 WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), first_week_and_diff AS ( SELECT *, -- DATE_DIFF(event_date, first_date, DAY) AS diff_of_day DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM ( SELECT # 일자별로 중복 제거 DISTINCT user_pseudo_id, -- DATE_TRUNC DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), user_counts AS ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt), 2) AS retention_rate FROM ( SELECT diff_of_week, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week ASC) AS first_week_user_cnt FROM user_counts ) -- SELECT -- diff_of_week, -- COUNT(DISTINCT user_pseudo_id) AS user_cnt -- FROM first_week_and_diff -- GROUP BY diff_of_week -- ORDER BY diff_of_week # Monthly 리텐션 쿼리 작성해보기!지금 코드가 각 diff_week마다 남은 유저들을 전체 유저로 나눠서 아 몇주차쯤 되면 얼마나 남아있는지를 계산한 거 같은데 생각해보니까 예를들어 지금 기간이 11월 3일까진데 한 10월 중순에 들어온 유저 같은 경우엔 diff_week가 한 3 이상인 부분부턴 아예 데이터가 없는거 아닌가요? 데이터가 11월 3일까지 밖에 없으니까요분모로 사용하는 diff_week=0인 지점에서의 값은 그런 경우들까지 전부 포함된거고 그걸 그대로 모든 retention week마다 분모로 사용하면 위 예시 같은 경우 10월 중순 user들은 한 3주차쯤엔 전부 이탈하는 것 처럼 집계되는거 아닌가요? 그 경우 diff_week가 커질수록 실제 리텐션 보다 과소평가 되는게 아닌가 하는 의문점이 들어 문의 남깁니다
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다
WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2023-08-03" ), first_week_and_diff AS ( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS weeks_after_first_week FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), user_counts AS ( SELECT first_week, weeks_after_first_week, COUNT(DISTINCT user_pseudo_id) AS active_users FROM first_week_and_diff GROUP BY first_week, weeks_after_first_week ) SELECT *, ROUND(SAFE_DIVIDE(active_users, cohort_users), 2) AS retention_rate FROM ( SELECT first_week, weeks_after_first_week, active_users, FIRST_VALUE(active_users) OVER(PARTITION BY first_week ORDER BY weeks_after_first_week ASC) AS cohort_users FROM user_counts ) ORDER BY first_week, weeks_after_first_week 수업때 사용했던 코드인데 제가 처음엔 지금 하고 있는 코호트 분석은 first_week(가입주) 마다 각자 시간이 흐르면서(기준은 week) 리텐션이 어떻게 바뀌는지를 보는 것 이라고 이해했었습니다 그래서 예를들어 첫 달 부터 확 떨어지면 이거 온보딩에 문제가 있는거 아닌가? 라는 문제정의를 하는 식의 생각을 할 수있다... 라고 이해하고 있었는데 다시 보니까지금처럼 base에 날짜 조건을 필터링 하고 시작하면 min(event_date)를 걸어도 그게 실제 첫 가입일이 아닐 수 있는거 아닌가요? 예를들어 필터링 조건 이전인 2022년 7월에 가입을 한 사람이 2022년 10월에 다시 돌아왔다고 치면 이 경우 2022년 10월 가입 user로 집계되는거지 않나요? 그럼 본래 보려던 거랑 결이 달라지는게 아닌가 싶어서요
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
biquery 테이블 생성 오류 이슈
안녕하세요. 빅쿼리에서 테이블 생성을 하려고 했으나 계속 실패하여 문의 남깁니다. 파싱 문제가 있는 것 같고, 결제 수단 등록 같은 어드민 문제는 아닌 것 같습니다. 윈도우이고 반디집으로 압축 해제한 뒤 파일 업로드했고 아래와같이 파일 형식도 지정했는데 못 읽는 이유가 있을까요? 감사합니다.오류 메시지: 테이블을 만들 수 없음: Error while reading data, error message: The Apache Orc library failed to parse file metadata from file tail with error: Not an ORC file File: bigstore/bigquery-prod-upload-us/prod-scotty-455134432611-bde32926-0829-41cc-80fa-43f553dc0a93
-
해결됨초보자를 위한 BigQuery(SQL) 입문
battle table 오류
현재 battle 미리보기 오류까진 해결하는 방법을 확인해서 basic2로 새로 세팅해서 battle을 만드는 과정에 있습니다. 그과정에서 해당 오류가 뜨고 있습니다. 이렇게 세팅된 상태이긴합니다. 근데 battle. CSV 파일 확인해보니 timestamp 쪽에서 사용자지정이 아닌 일반으로 되어, 시간이 안나오고 문자열로 된 상태인데, 이거땜에 오류가 발생하는건지 문의드립니다.테이블 만들기
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다
SELECT user_id , event_date , event_name , event_timestamp , user_pseudo_id , MAX(IF(par.key='firebase_screen', par.value.string_value, NULL)) AS firebase_screen , MAX(IF(par.key='food_id', par.value.int_value, NULL)) AS food_id , MAX(IF(par.key='session_id', par.value.string_value, NULL)) AS session_id FROM `advanced.app_logs` CROSS JOIN UNNEST(event_params) AS par WHERE event_date = '2022-08-01' GROUP BY ALL LIMIT 100; app_logs 피벗하는 문제인데 food_id가 null 밖에 없는 건 아니지만 보여주신 화면과 그 값이 많이 상이한 거 같아서요.. 이유가 뭔지를 알 수 있을까요 ㅜㅜ
-
해결됨초보자를 위한 BigQuery(SQL) 입문
location IS NOT NULL 을 굳이 안 써도 되지 않나요?
문제 3번입니다.hometown 값은 존재하고, location이 NULL일 때 WHERE에서 tp.location = t.hometown 진행하면 자동으로 FALSE가 나오지 않을까요?location IS NOT NULL 구문을 추가하신 이유가 궁금합니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
12강 집계 함수
안녕하세요. 12강 집계 함수 연습 문제 7~9 번 풀이 중 궁금한 것이 있습니다. 9번 문제의 경우 풀이해주실때 SELECT 이후 컬럼 generation 을 작성해주셨는데 , 8번 문제 풀이 시 select 이후 컬럼 을 따로 작성하지 않아서 두 가지 모두 쿼리문에 작성해본 결과 , 컬럼을 작성했을 경우 결과에서도 컬럼이 함께 나온다는 것을 확인 할 수 있었습니다. 이런 것은 문제를 풀다보면 결과에 컬럼이 같이 표기가 되어야 하는건지 아닌지를 구분해서 해야하는 것인지 궁금합니다 .비전공자라 다소 질문에 부족한 부분이 있을 수 있는데, 답변 주시면 감사하겠습니다 🙂
-
해결됨초보자를 위한 BigQuery(SQL) 입문
2-6. 연습 문제 1~3번
type2 null이 있음에도 불구하고, count시 값이 0으로 노출됩니다.[테이블 미리보기][쿼리 결과] [엑셀 파일]*맥 압축파일을 윈도우 환경에서 오픈해서 그런지, 파일 상태가 이상해요.값이 이렇게 들어갈 수가 있나요?
-
해결됨초보자를 위한 BigQuery(SQL) 입문
안녕하세요! 11번 문제 query문에 관해 질문드립니다
저 같은 경우 가장 많은 type1이 뭐냐는 질문에 max함수를 이용했는데, 선생님은 count랑 order by로 사용하셨더라고요. max함수를 사용하지 않은 이유가 있으신가요? 아래는 제가 작성한 query입니다SELECT MAX(type1) FROM `basic.pokemon` WHERE type2 is not null
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[과제] 퍼널 PIVOT 테이블 작성하기
안녕하세요 카일님!강의 너무 잘 듣고 있습니다! 온오프라인에서 SQL실무와 관련된 강의가 없어 많이고민했는데 카일님 강의 덕분에 입문 강의 부터 정말 많이 배웠습니다 ㅜㅜ! 아래 일자별 퍼널을 PIVOT 해보는 쿼리를 짜봤는데 피드백 주시면 너무 감사하겠습니다!더불어서 PIVOT을 할 때 제가 아래 주석처리한 것들도 디버깅 했을때는 동일하게 나왔는데혹시나 실무단에서 어떻게 하는건 조심해야한다! 라는 부분이 있을지도 궁금합니다..! 항상 감사합니다 :) #일자별 퍼널 PIVOT WITH base AS ( SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, platform, MAX(IF(param.key = "firebase_screen", param.value.string_value, NULL )) AS firebase_screen, -- MAX(IF(param.key = "food_id", param.value.int_value, NULL )) AS food_id, MAX(IF(param.key = "session_id", param.value.string_value, NULL )) AS session_id, -- param.key AS screen, -- param.value.string_value AS string_value, -- param.value.int_value AS int_value, FROM `advanced.app_logs` CROSS JOIN UNNEST(event_params) AS param WHERE -- event_date = "2022-08-01" #적은 데이터로 쿼리를 작성하기 위해 만들어둔 조건 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), 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") ), event_by_user_cnt_by_date AS ( --event_name + screen (필요한 이벤트만 WHERE 조건에 걸어서 사용) --step_number + COUNT --step_number : CASE WHEN 사용해 숫자 지정 1~6 (welcome, home, food_category, restaurant, cart ) SELECT -- DISTINCT event_name_with_screen, #해당 열 Unique값 확인 가능 event_date, #일자별로 퍼널별 유저수 쿼리 event_name_with_screen, -- event_datetime, user_pseudo_id, 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-restaurarnt" 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 --screen_view-restaurant/screen_view-food_detail/screen_view-search/screen_view-search_result 도 퍼널 정의에 어떻게 넣을지 생각해보고 단계에 넣어보기 > 고객이 어떤 흐름으로 움직이는지 확인해보기 HAVING step_number IS NOT NULL ORDER BY event_date ) SELECT event_date, SUM(IF(event_name_with_screen = 'screen_view-welcome', cnt, NULL)) AS screen_view_welcome, SUM(IF(event_name_with_screen = 'screen_view-home', cnt, NULL)) AS screen_view_home, SUM(IF(event_name_with_screen = 'screen_view-food_category', cnt, NULL )) AS screen_view_food_category, SUM(IF(event_name_with_screen = 'screen_view-restaurarnt', cnt, NULL)) AS screen_view_restaurarnt, SUM(IF(event_name_with_screen = 'screen_view-cart', cnt, NULL)) AS screen_view_cart, SUM(IF(event_name_with_screen = 'click_payment-cart', cnt, NULL)) AS click_payment_cart, -- 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-restaurarnt', cnt, NULL)) AS screen_view_restaurarnt, -- 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, -- MAX(CASE WHEN event_name_with_screen = 'screen_view-welcome' THEN cnt END) AS screen_view_welcome, -- MAX(CASE WHEN event_name_with_screen = 'screen_view-home' THEN cnt END) AS screen_view_home, -- MAX(CASE WHEN event_name_with_screen = 'screen_view-food_category'THEN cnt END) AS screen_view_food_category, -- MAX(CASE WHEN event_name_with_screen = 'screen_view-restaurarnt'THEN cnt END) AS screen_view_restaurarnt, -- MAX(CASE WHEN event_name_with_screen = 'screen_view-cart'THEN cnt END) AS screen_view_cart, -- MAX(CASE WHEN event_name_with_screen = 'click_payment-cart'THEN cnt END) AS click_payment_cart FROM event_by_user_cnt_by_date GROUP BY event_date ORDER BY event_date ;
-
해결됨초보자를 위한 BigQuery(SQL) 입문
2-6 #2 WHERE vs. HAVING절 사용 여부 차이
제 쿼리문 작성 결과입니다. 멘토님이 작성해주신 것과의 차이를 보았을 때 조건이 HAVING절로 표현되었는지 WHERE절로 표현되었는지에 대한 차이, GROUP BY에 type2에 대한 출력값도 요구한다는 점이 차이로 보입니다. 강의 내용 중에 HAVING은 'GROUP BY 후 조건 설정할 때' 사용된다는 표현이 있어서 헷갈림이 있었던 것 같습니다. 이 문제를 HAVING절을 사용하여서 푸는 방법도 있을지요? 그렇지 않다면 이유는 무엇이 되는지요? 감사합니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
섹션 별 퀴즈
질문이 있는 경우 다음과 같이 시도해보고 공유해주세요구글에 검색한 후, 어떤 결과가 나왔는지그 결과를 토대로 어떤 시도를 했는지? 시도에서 어떤 과정이 진행되지 않았는지데이터를 추출하는 과정에 대한 고민은 Input / Output을 작성해주세요 안녕하세요.시작 전에 문제를 풀고 강의를 수강하라고 하셨는데말씀주신 문제가 섹션별로 나와있는 퀴즈를 말씀하신걸까요?
-
미해결마케터와 기획자를 위한 GA4 Bigquery 입문 (2025)
강의노트
안녕하세요강의에서 설명하시는 강의노트는 다운받을 수 있는 방법이 있나요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
array 등
안녕하세요 데이터분석가로 근무하고 있는 수강생입니다.array 등과 같은 기능이 저는 다소 생소한데 자주 쓰는 문법인지 궁금합니다ㅣ