묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
강의 자료 파일을 열 수 없습니다.
윈도우 사용자입니다. 첨부파일을 다운로드 받았는데, 압축파일 풀기를 하면 아래와 같이 오류 메시지가 나오는데요. 어떻게 해결하면 좋을까요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
퍼널별 유저들의 새로운 세션 시작 횟수의 총합 _ 윈도우 함수 마지막 문제 응용
안녕하세요. 저는 이번에 마지막 문제를 응용해서, 퍼널별로 유저들의 새로운 세션 시작 횟수의 총합을 계산해보았습니다.[결과 그래프]새로운 세션 시작 기준: 이전 세션 시간 대비 20초 이상이 지나면, 새로운 세션을 활성화했다고 가정 (강의 내용과 동일)첫번째 강의에서 배운, UNNEST 문법과 PIVOT 을 하는 방법을 활용해서, event_params에 있는 firebase_screen의 string_value 값을 새로운 열인 firebase_screen 이라고 만듭니다. 전체 데이터를 조회하면, 쿼리 비용이 많이 들기 때문에, where 조건 절로 값을 작게 명시해줍니다.WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep WHERE event_date = '2022-08-18' AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL )LAG() 함수를 사용하여, 이전 날짜 값을 가져옵니다. 이 때, 퍼널별로 구해야하기 때문에, PARTITION BY에 firebase_screen 을 써줍니다. 그 후, DATETIMEDIFF 함수를 사용해서, 현재값과 이전값의 차이를 계산합니다.WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep WHERE event_date = '2022-08-18' AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL ), diff_funnel_time AS ( SELECT *, DATETIME_DIFF(event_timestamp, prev_event_timestamp, SECOND) AS second_diff FROM ( SELECT *, LAG(event_timestamp, 1) OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS prev_event_timestamp FROM base ) ) SELECT * FROM diff_funnel_time3. ROW_NUMBER() 함수를 사용해서, 퍼널별로 순서를 매깁니다. 그 후, second_diff 의 값이 NULL인 경우는 해당 퍼널의 첫 시작 위치를 가리키므로 1을 넣어주고, rn > 1이고 second_diff >= 20인 경우는 1을 넣어줍니다. 이 때 funnel_per_session_start 컬럼은 퍼널별로 새로운 세션이 시작했는지 여부를 가리킵니다. , funnel_start AS ( SELECT *, CASE WHEN second_diff IS NULL THEN 1 WHEN rn > 1 AND second_diff >= 20 THEN 1 ELSE 0 END AS funnel_per_session_start FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS rn FROM diff_funnel_time ) )이제, 퍼널별로 세션 시작 여부를 SUM()하고, GROUP BY를 해줍니다.SELECT firebase_screen, SUM(funnel_per_session_start) AS funnel_per_session_start_cnt FROM funnel_start GROUP BY ALL ORDER BY 2 DESC;WHERE 조건절을 주석처리하고, 전체 데이터에 대해서, 집계해봅니다. WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep -- WHERE -- event_date = '2022-08-18' -- AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL ), diff_funnel_time AS ( SELECT *, DATETIME_DIFF(event_timestamp, prev_event_timestamp, SECOND) AS second_diff FROM ( SELECT *, LAG(event_timestamp, 1) OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS prev_event_timestamp FROM base ) ) , funnel_start AS ( SELECT *, CASE WHEN second_diff IS NULL THEN 1 WHEN rn > 1 AND second_diff >= 20 THEN 1 ELSE 0 END AS funnel_per_session_start FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS rn FROM diff_funnel_time ) ) SELECT firebase_screen, SUM(funnel_per_session_start) AS funnel_per_session_start_cnt FROM funnel_start GROUP BY ALL ORDER BY 2 DESC;
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
windows function default 값에 대하여 range between과 rows between의 차이
안녕하세요. 강의를 잘 듣고 있습니다.다름이 아니라, 연습문제를 모두 풀고 나서 윈도우함수 강의를 듣는 과정에서, default에 대해 궁금한 점이 생겼습니다. 정확히, 계산을 해야할 경우, 중복된 데이터가 있는 경우를 고려해서, ROWS BETWEEN UNBOUNDED PRECEDINIG AND CURRENT ROW 라고 프레임의 범위를 정확하게 명시를 하는 것이 좋을 것 같다. 라는 생각이 들었습니다.그 이유는 다음과 같습니다.강의에서 말씀해주신대로, 구글 빅쿼리는 default 값이 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 라고 되어있는데요,-- 4) -- 누적 쿼리: 과거의 시간(UNBOUNDED PRECEDING)부터 current row까지 SELECT *, SUM(query_cnt) OVER(PARTITION BY user ORDER BY query_date) AS cumulative_sum SUM(query_cnt) OVER(PARTITION BY user ORDER BY query_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sum2 FROM ( SELECT query_date, team, user, COUNT(user) AS query_cnt FROM advanced.query_logs GROUP BY ALL ) -- QUALIFY cumulative_sum != cumulative_sum2 ORDER BY user, query_date문득, default값이 RANGE BETWEEN UNBOUND PRECEDING AND CURRENT ROW 라면, 왜 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 와 같은 값을 가질까? 다른 값을 가지는 경우도 있지 않을까? 하는 의문이 들었습니다.예제에서는, GROUP BY ALL을 했기 때문에, 중복 데이터가 있어도, query_cnt로 집계가 된 상태에서, 윈도우 함수를 실행하다보니, QUALIFY로 조건절 검증을 수행해도, != 를 만족하는 데이터가 없었던 것 같았습니다.그래서, 1번 예제와 4번 예제를 결합해서, 다음과 같이 검증을 수행해보았습니다.-- INSERT INTO my_sess.query_logs (user, team, query_date) -- VALUES ('샘', 'Data Science', '2024-04-24'); SELECT *, -- 시간의 흐름에 따라, 일자별 유저가 실행한 누적 총 쿼리 수 SUM(total_query_cnt) OVER(PARTITION BY user ORDER BY query_date) AS cumulative_total_sum, SUM(total_query_cnt) OVER(PARTITION BY user ORDER BY query_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_total_sum2 FROM ( SELECT *, -- 사용자별 시간의 흐름에 따라 쿼리를 실행한 총 횟수: total_query_cnt COUNT(query_date) OVER(PARTITION BY user) AS total_query_cnt FROM my_sess.query_logs ) -- QUALIFY cumulative_total_sum != cumulative_total_sum2 ORDER BY user, query_date결과는 다음과 같습니다.중복데이터가 있을 경우, RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW는 다 합쳐서 하나로 집계해서 결과값을 내놓는 것으로 보입니다.QUALIFY 함수를 적용했을 때cumulative_total_sum = cumulative_total_sum2 인 경우데이터 중복이 없을 경우에는, 같은 값이 나옵니다.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
소리는 잘 들리는데 화면이 검은 화면으로 나와요
맥북 크롬 환경에서 강의 수강하고 있는데 소리만 들리고 강의 화면이 검정 화면으로만 나옵니다. 혹시 저만 그런걸까요..??
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
Bigquery 활용편(PDF)파일 P.229 페이지 코드 오류
안녕하세요. 이어서, 윈도우 함수에 대해서 잘 듣고 있습니다.Bigquery PDF파일의 P.229페이지를 보면, LAST_VALUE 에 대해서, 쿼리 값이 있는데요, LAST_VALUE가 각 파티션을 나눈 user_id의 마지막 값(1004의 경우, 8, 2112의 경우 7, 3912의 경우 4)를 가져오려면, UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 값이 들어가야 합니다.그 이유가, 해당 FRAME이 따로 정의되어있지 않으면, 다음과 같은 값이 나옵니다.섹션 2-4 윈도우 함수 탐색 함수 연습 문제에서, FIRST_VALUE, LAST_VALUE로도 한번 쿼리 작성을 해보라는 연습을 해보라고 하셔서, 연습하는 도중에 발견하게 되었습니다.이번에는 UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 을 추가해보겠습니다.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
파티셔닝 시, 데이터 크기가 0B가 됩니다!
안녕하세요. 빅쿼리를 좀 더 공부하고 싶어, 강의를 결제하게 되었습니다.다름이 아니라, app_logs_temp 데이터를 강의에서 알려준대로, upload 하고 테이블을 만들었을 떄는 정상적으로, 잘 표시가 되는데요, 문제는 event_date 를 기준으로 (날짜 기반 파티셔닝)을 했을 때, 데이터가 0B가 되는 문제가 발생합니다!Array, Struct 문제에서 4번 문제를 풀때, "데이터를 표시할 수 없다" 라는 말이 있어서, 왜 이럴까.. 하다가, 발견하게 되었어요..저는 이미 예전에 빅쿼리를 사용해본 적이 있어서, billing account 계정이 모두 연결된 상태이구요. chatgpt 말로는 이 방법도 안된다면, 빈 파티셔닝 테이블 만들어 놓고 INSERT INTO로 하나하나 데이터 넣으라는데... 예전에 프로젝트 할 때, 이 방법으로 했다가 돈이 꽤 나와서요.. 어떻게 해야할까요?
-
해결됨초보자를 위한 BigQuery(SQL) 입문
5-6 1번 문제
안녕하세요. where에 조건을 걸기 전에 조인하고 한번 해봤는데 결과 갯수가 차이가 있습니다. 어떤 부분 때문에 이런 차이가 발생할까요?
-
해결됨초보자를 위한 BigQuery(SQL) 입문
주석처리 -- 빠르게 입력하는 방법(?)
카일님의 강의 잘 듣고 있습니다!2가지 질문이 있습니다!1번 질문) 카일님이 강의를 하시면서 주석처리를 되게 빠르게 실행하시는 것 같으신데, 혹시 팁을 공유해주실 수 있으실까요?-- 를 매번 입력하시는 것인가요?!2번 질문)5-6강의 11분 49초에서 쿼리를 빠르게 주석처리하기 위해서 앞에서 true인 1=1을 넣고, and쓰고 빠르게 주석처리..이 부분이 이해가 안됩니다.. 1=1을 넣는 것과 and에 주석처리를 거는 것과 무슨 연관이 있는 건가요?좋은 강의 늘 감사합니다!
-
해결됨초보자를 위한 BigQuery(SQL) 입문
4-7 5번 '이후'
카일님~혹시 5번 문제의 '이후'가 사전적으로는 기준이 되는 때도 포함이 되어서 >=로 작성이 되어야 할 것 같은데,강의에서는 >로 작성하셨더라구요.. 혹시 이렇게 작성하신 다른 이유가 있으신지 궁금합니다..!감사합니다 :)
-
해결됨초보자를 위한 BigQuery(SQL) 입문
4-7 3번 BETWEEN의 범위
카일님 안녕하세요 :)4-7 3번 문제에서 BETWEEN을 사용해주셨는데mysql에서의 BETWEEN 범위는 이상, 이하라고 하는데 혹시 bigquery는 그 포함 관계가 다른걸까요?301에서 500 사이면 BETWEEN 301 AND 500 이어야 할 것 같은데 300으로 작성하신 이유가 궁금합니다.나름대로 검증해보려고 total=301인 데이터를 뽑아보려했는데 pokemon 데이터에는 포함 안되어 있더라구요..ㅎㅎㅠ그리고 제가 3일 정도 뒤에 갑작스레 SQL 코딩테스트를 보게 되어 벼락치기를 해야하는 상황인데카일님의 SQL 개념+문풀 JOIN까지 듣고 프로그래머스 고득점 Kit로 문풀을 하면될지..시간이 넘 촉박해서 다 할 수 있을지는 모르겠는데 혹시 좀더 효율적인 공부 방향이나 팁이 있다면 추천 부탁드려도 될까요?ㅠㅠ항상 선한 영향력 감사합니다!!
-
해결됨초보자를 위한 BigQuery(SQL) 입문
안녕하세요
강의 너무 잘 듣고 있습니다.혹시 활용편은 언제쯤 출시될 예정일까요?
-
해결됨초보자를 위한 BigQuery(SQL) 입문
battle 미리보기 업로드 오류
안녕하세요 카일님~battle 데이터를 업로드하고 말씀해주신 설정을 똑같이 적용했는데미리보기에서 데이터가 보이지 않고, 쿼리의 FROM으로 불러와도 '표시할 데이터가 없습니다'라고 뜹니다혹시 관련해서 도움을 구할 수 있을까요?ㅠㅠ그리고 강의 너무너무 잘 보고 있습니다.. 최곱니다 너무 감사드려요ㅎㅎ (해결 완료)아래 게시글에서 '빌링 어카운트(결제 계좌)' 연결 후에 문제 해결되셨다고 하셨습니다.저는 '엇? 나는 지금 결제 계좌 연결되어있는데..?'라고 잠시 생각했으나다시 되짚어보니 제가 basic 데이터셋을 초반에 만들고, 그 이후에 결제 계좌를 연결했을 수도 있을 것 같아요그래서 저는 basic2 데이터셋을 새로 생성해서 battle 테이블을 생성해보니 정상적으로 진행되는 것을 확인했습니다!요약하면 '결제 계좌 연결 => 데이터셋(basic) 생성 => battle 테이블 생성' 순서가 반드시 지켜져야오류없이 진행되는 것 같습니다ㅠㅠ 원인을 알게 되어 정말 다행이고, 공유해주셔서 감사합니다 :)https://www.inflearn.com/questions/1250442/battle-%ED%85%8C%EC%9D%B4%EB%B8%94-%ED%98%95%EC%84%B1%ED%95%A0-%EB%95%8C-%EC%A0%9C%EA%B0%80-%EC%96%B4%EB%96%A4-%EC%8B%A4%EC%88%98%EB%A5%BC-%ED%96%88%EC%9D%84%EA%B9%8C%EC%9A%94
-
해결됨초보자를 위한 BigQuery(SQL) 입문
파일 업로드 오류와 관련해서 재질문 합니다.
질문 드렸던 이전 게시글▶ https://www.inflearn.com/questions/1229720/pokemon-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%84-%EC%83%9D%EC%84%B1%ED%95%98%EA%B3%A0%EC%9E%90-%ED%95%98%EB%8A%94%EB%8D%B0-%EB%9C%A8%EB%8A%94-%EC%98%A4%EB%A5%98?re_comment_id=349352 =구글 드라이브에 파일을 업로드 한 후 공유 드립니다.https://drive.google.com/file/d/1Z8y2eJSlwfYEexaxyAan7Rt3xPrJtznE/view?usp=sharing
-
해결됨초보자를 위한 BigQuery(SQL) 입문
Espanso 실행 문제 해결
안녕하세요. 수업 유익하게 잘 듣고 있습니다! Espanso를 다운받아서 설정해봤는데요! 텍스트 편집기에서 수정까지 되었고, espanso 프로그램에서 open search bar 를 눌러봤을 때 첨부드린 이미지처럼 :sql 이 잘 들어가 있습니다. 그런데 :sql 과 같은 trigger 단어를 입력해도 변하지 않아서 어떤 다른 해결 방법이 있을지 문의드립니다.혹시 espanso의 설정 수정까지는 잘 되었으나, espanso가 어떤 권한 문제로 적용이 안될 수도 있나요? 추가로 시도해볼만한 방법이 있다면 안내 부탁드립니다. 감사합니다!
-
해결됨초보자를 위한 BigQuery(SQL) 입문
활용편 급합니다.....
활용편 언제 나오나요급합니다.... 빨리 내놓으십쇼..유료로 내주셔도 긁겠습니다
-
해결됨초보자를 위한 BigQuery(SQL) 입문
오류
다음과 같이 실행했는데 오류가 뜨는데, 이유가 무엇일까요? SELECT * IF(speed >= 70, "빠름", "느림") AS Speed_Category FROM `inflearn-bigquery-practice.basic.pokemon` Syntax error: Expected end of input but got keyword IF at [3:3]
-
해결됨초보자를 위한 BigQuery(SQL) 입문
총 정리 문제 풀이 5번에 관해 질문
안녕하세요.총 정리 문제 풀이 5번의 선생님의 쿼리와, 해설을 보기 전에 개인적으로 써본 쿼리의 각각의 결과가 달라 어디서 오류를 범했는지 알고 싶어 질문합니다. 선생님께서 쓰신 쿼리는 다음과 같았습니다.WITH에서 먼저 trainer_pokemon과 pokemon을 JOIN한 후, 마지막에 trainer를 JOIN하셨습니다.결과는 Kyle의 포켓몬 공격력+방어력 총합 1951였습니다.WITH total_stats AS ( SELECT tp.trainer_id, SUM(p.attack + p.defense) AS total_stat, FROM basic.trainer_pokemon AS tp LEFT JOIN basic.pokemon AS p ON tp.pokemon_id = p.id GROUP BY tp.trainer_id ) SELECT t.name, ts.trainer_id, ts.total_stat FROM total_stats AS ts LEFT JOIN basic.trainer AS t ON ts.trainer_id = t.id ORDER BY total_stat DESC LIMIT 1 그리고 저는 다음과 같이 썼습니다.선생님의 순서와 다르게, WITH에서 먼저 trainer_pokemon과 trainer를 JOIN한 후, 마지막에 pokemon을 JOIN했습니다.결과는 Kyle의 포켓몬 공격력+방어력 총합 1856였습니다.WITH pokemon_cnt_table AS( SELECT t.id, t.name, tp.pokemon_id, COUNT(tp.id) AS pokemon_cnt, FROM `basic.trainer_pokemon` AS tp LEFT JOIN `basic.trainer` AS t ON tp.trainer_id = t.id GROUP BY t.id, t.name, tp.pokemon_id ) SELECT pct.id, pct.name, SUM(attack) AS attack_sum, SUM(defense) AS defense_sum, SUM(attack + defense) AS a_plus_d_sum, FROM pokemon_cnt_table AS pct LEFT JOIN `basic.pokemon` AS p ON pct.pokemon_id = p.id GROUP BY pct.id, pct.name ORDER BY a_plus_d_sum DESC LIMIT 1 결과가 달라진 이유에 대해, 제 나름대로 생각해 본 것은, JOIN의 순서가 달라 WITH 내의 1) SELECT, 2) FROM ON의 키도 다른 점이 출력 데이터에 영향을 준 것이 아닐까 하는 것입니다. JOIN의 순서 차이로 결과가 달라질 수 있을까요?제가 작성한 쿼리의 오류에 대한 확인이 번거로우시다면, 결과에 대한 JOIN 순서 차이의 영향 유무에 대해서만 답해 주셔도 감사하겠습니다. 미리 감사합니다.
-
해결됨SQL 시작도 못한 분들 드루와요
빅쿼리 테이블 만들기 오류
안녕하세요. 현재 sql 강좌 수강 중에 빅쿼리 테이블 만들기가 오류가 떠서 질문드립니다.업로드 할 csv 파일은 압축풀고 여러번 업로드 했으나 충돌이 많이 된다고 테이블 생성이 되지 않습니다.csv 파일 자체에 들어가보니, max os ~ 라고 되어 있던데 저는 윈도우 사용자인데 이때 어떻게 오류 해결 해야 하나요? ** 에러 메세지와 이미지 캡쳐본>> Error while reading data, error message: CSV processing encountered too many errors, giving up. Rows: 0; errors: 1; max bad: 0; error percent: 0
-
해결됨초보자를 위한 BigQuery(SQL) 입문
4-7. 조건문 연습 문제 5번에 관한 질문
안녕하세요.조건문 연습 문제 5번의 선생님께서 쓰신 정답에 관해 질문입니다.select 안에, 포획 날짜를 표시하기 위해 원래 basic.trainer_pokemon 안에 존재하는 catch_datetime을 쓰셨는데, Asia/Seoul 시간대로 변경되지 않은 상태를 그대로 쓰신 이유가 있을까요?SELECT id, trainer_id, pokemon_id, catch_datetime, IF (DATE(catch_datetime, "Asia/Seoul") > "2023-01-01", "Recent", "Old") as recent_or_old FROM `basic.trainer_pokemon` if 함수 내에서 수정한 날짜를 보여주기 위해, 똑같이 수정한 날짜를 썼는데, 문제 없을까요?SELECT id, trainer_id, pokemon_id, DATE(catch_datetime, "Asia/Seoul") as corrected_catch_date, IF (DATE(catch_datetime, "Asia/Seoul") > "2023-01-01", "Recent", "Old") as recent_or_old FROM `basic.trainer_pokemon` 미리 감사합니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
4-5. 연습 문제 1번의 정답에 관해 질문
안녕하세요, 4-5. 연습 문제 1번(#트레이너가 포켓몬을 포획한 날짜(catch_date)를 기준으로, 2023년 1월에 포획한 포켓몬의 수를 계산해 주세요.)의 정답을 보고 의문이 있어 질문 올립니다. 선생님께선 아래와 같이 쿼리를 작성해 주셨는데요. count 함수의 변수, id는 처음부터 고유한 번호인데 distinct를 걸어주신 이유를 알고 싶습니다. (count 결과는 85)select count(distinct id) as cnt from `basic.trainer_pokemon` where extract (year from datetime(catch_datetime, "Asia/Seoul")) = 2023 and extract (month from datetime(catch_datetime, "Asia/Seoul")) = 1 실험적으로, trainer_id를 변수로 쓴 것과, distinct를 걸어서 trainer_id를 변수로 쓴 것의 결과를 확인해 보니, 각각 85, 48이었습니다.select count(trainer_id) as cnt, count(distinct trainer_id) as distinct_cnt from `basic.trainer_pokemon` where extract (year from datetime(catch_datetime, "Asia/Seoul")) = 2023 and extract (month from datetime(catch_datetime, "Asia/Seoul")) = 1 1명의 트레이너가 2023년 1월에 2마리 이상의 포켓몬을 포획하는 경우도 있을 수 있으니, distinct를 걸어버리면, 1월에 여러 번 포획한 횟수가 1회로 줄어버리지 않을까 생각되는데, 잘못된 곳이 있다면 짚어주셨으면 합니다. 미리 감사합니다.