묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결초보자를 위한 BigQuery(SQL) 입문
총 정리 문제 2번 쿼리 결과 질문
안녕하세요 카일스쿨님!총 정리 문제 2번의 쿼리 결과를 보고 문뜩 궁금증이 생겨 질문 남깁니다. 이렇게 쿼리를 짜서 카일스쿨님이 문제 풀이해주신 것처럼 같은 결과가 나왔습니다. 다만, 현재 GROUP BY가 타입1과 한글 이름 두 가지로 기준을 잡고 있어서저는 타입 1을 기준으로 가장 많은 포켓몬 수가 나올지, 아니면 한글이름 기준으로 가장 많은 포켓몬 수가 나올지 궁금해 했었는데, 한글 이름 기준으로 가장 많은 포켓몬 수가 나오더라구요!이러한 경우에는 왜 타입1과 한글 이름 두 가지가 다 기준으로 잡혀있는데, 타입1 기준이 아니라 한글 이름 기준으로 가장 많은 포켓몬 수가 출력되는 걸까요? 참고로 타입 1 기준으로 가장 많은 포켓몬 수를 구해봤더니 1순위는 Water로 나왔습니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
JOIN 기준 질문
카일님, 안녕하세요! LEFT JOIN 기준이 헷갈려 이에 대한 질문 드립니다.LEFT JOIN 시 테이블의 데이터가 더 많은 테이블을 제일 왼쪽으로 두면 된다고 이해하면 될까요? 또한, 예외도 있다고 하셨는데, 어떤 경우인지도 알 수 있을까요?마지막으로 LEFT말고 다른 JOIN할 때도 테이블의 데이터가 더 많은 테이블을 기준으로 잡아도 괜찮나요?감사합니다!
-
해결됨초보자를 위한 BigQuery(SQL) 입문
2-5 where과 having 예시 쿼리문에 대한 질문
pdf파일 158페이지, 159페이지에 있는 where과 having 쿼리 예시문을 보다가 궁금한 게 생겨서요.where 쿼리문 : select 컬럼 1, 컬럼2라고 돼 있는데 group by 컬럼1, 컬럼2 라고 하지 않아도 실행이 가능한가요?having 쿼리문 : group by하는(그룹화 기준) 컬럼과 count 컬럼이 같을 수도 있나요? count (컬럼3)이어야 하지 않는지 궁금합니다!
-
해결됨SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법
13:57 쿼리실행화면 차이점
13:57 쯤에 나오는 쿼리 실행 화면이 강사님 화면과 좀 다른데 특별한 이유가 있을까요?차이점LEFT / RIGHT JOIN SORT
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
리텐션 과제 연습문제 4번(core_event)
최근에, 면접이 있어서 공부를 제대로 못했네요. 오늘부터 매일 매일 못했던 공부를 다시 해보려고 합니다.문제: core_event를 'click_payment'라고 설정하고, Weekly Retention을 구하여라.저는 click_payment 까지의 사용자 여정 별로 세그먼트를 나누려는 시도를 해보았습니다. 문제에 대한 고민사항은 길어지니, 최종적으로 나누었던 세그먼트를 먼저 소개해드리겠습니다.click_payment 까지의 여정은 크게 다음과 같이 구성할 수 있습니다.click_search(검색) -> click_paymentclick_banner(배너 클릭) -> click_paymentclick_food_category(음식 카테고리 클릭) -> click_paymentclick_restaurant_nearby( 내 위치 기반 주변 레스토랑) -> click_paymentclick_recommend_food(추천) -> click_payment크게 다음과 같이 5개의 세그먼트로 나누어보고, 각 세그먼트 별로, Count를 해보았습니다. 이 때, click_login -> click_search -> .... -> click_payment -> click_search .... 이런 경우를 대비해서, 각 이벤트마다 제일 처음 이벤트가 발생한 시간 을 기준으로 구분하도록 하였습니다. 이제 각 퍼널별로 리텐션을 구해보겠습니다.WITH user_events AS ( SELECT user_pseudo_id, event_name, event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, ROW_NUMBER() OVER (PARTITION BY user_pseudo_id, event_name ORDER BY event_timestamp) AS r_num FROM advanced.app_logs WHERE event_name IN ('click_search', 'click_banner', 'click_food_category', 'click_restaurant_nearby', 'click_recommend_food', 'click_payment') AND event_name NOT IN ('screen_view', 'click_login') ), FIRST_EVENTS AS ( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM ( SELECT user_pseudo_id, event_date, 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, MIN(CASE WHEN event_name = 'click_search' THEN event_timestamp END) OVER (PARTITION BY user_pseudo_id, event_date) AS first_search_time, MIN(CASE WHEN event_name = 'click_payment' THEN event_timestamp END) OVER (PARTITION BY user_pseudo_id, event_date) AS first_payment_time, MIN(CASE WHEN event_name = 'click_banner' THEN event_timestamp END) OVER (PARTITION BY user_pseudo_id, event_date) AS first_banner_time, MIN(CASE WHEN event_name = 'click_food_category' THEN event_timestamp END) OVER (PARTITION BY user_pseudo_id, event_date) AS first_food_category_time, MIN(CASE WHEN event_name = 'click_restaurant_nearby' THEN event_timestamp END) OVER (PARTITION BY user_pseudo_id, event_date) AS first_restaurant_nearby_time, MIN(CASE WHEN event_name = 'click_recommend_food' THEN event_timestamp END) OVER (PARTITION BY user_pseudo_id, event_date) AS first_recommend_food_time FROM user_events ) ), FUNNEL_CLASSIFICATION AS ( SELECT DISTINCT *, CASE WHEN first_search_time IS NOT NULL AND first_payment_time IS NOT NULL AND first_search_time < first_payment_time THEN 'click_search -> click_payment' WHEN first_banner_time IS NOT NULL AND first_payment_time IS NOT NULL AND first_banner_time < first_payment_time THEN 'click_banner -> click_payment' WHEN first_food_category_time IS NOT NULL AND first_payment_time IS NOT NULL AND first_food_category_time < first_payment_time THEN 'click_food_category -> click_payment' WHEN first_restaurant_nearby_time IS NOT NULL AND first_payment_time IS NOT NULL AND first_restaurant_nearby_time < first_payment_time THEN 'click_restaurant_nearby -> click_payment' WHEN first_recommend_food_time IS NOT NULL AND first_payment_time IS NOT NULL AND first_recommend_food_time < first_payment_time THEN 'click_recommend_food -> click_payment' ELSE 'Other' END AS funnel FROM FIRST_EVENTS WHERE first_payment_time IS NOT NULL ), PIVOTED_ANALYSIS AS ( SELECT diff_of_week, COUNT(DISTINCT CASE WHEN funnel = 'click_search -> click_payment' THEN user_pseudo_id END) AS user_cnt_search_payment, COUNT(DISTINCT CASE WHEN funnel = 'click_banner -> click_payment' THEN user_pseudo_id END) AS user_cnt_banner_payment, COUNT(DISTINCT CASE WHEN funnel = 'click_food_category -> click_payment' THEN user_pseudo_id END) AS user_cnt_food_category_payment, COUNT(DISTINCT CASE WHEN funnel = 'click_restaurant_nearby -> click_payment' THEN user_pseudo_id END) AS user_cnt_restaurant_nearby_payment, COUNT(DISTINCT CASE WHEN funnel = 'click_recommend_food -> click_payment' THEN user_pseudo_id END) AS user_cnt_recommend_food_payment FROM FUNNEL_CLASSIFICATION GROUP BY diff_of_week ), INITIAL_USERS AS ( SELECT FIRST_VALUE(user_cnt_search_payment) OVER (ORDER BY diff_of_week) AS first_user_cnt_search_payment, FIRST_VALUE(user_cnt_banner_payment) OVER (ORDER BY diff_of_week) AS first_user_cnt_banner_payment, FIRST_VALUE(user_cnt_food_category_payment) OVER (ORDER BY diff_of_week) AS first_user_cnt_food_category_payment, FIRST_VALUE(user_cnt_restaurant_nearby_payment) OVER (ORDER BY diff_of_week) AS first_user_cnt_restaurant_nearby_payment, FIRST_VALUE(user_cnt_recommend_food_payment) OVER (ORDER BY diff_of_week) AS first_user_cnt_recommend_food_payment FROM PIVOTED_ANALYSIS LIMIT 1 ) SELECT pa.diff_of_week, pa.user_cnt_search_payment AS search_active_user, pa.user_cnt_banner_payment AS banner_active_user, pa.user_cnt_food_category_payment AS category_active_user, pa.user_cnt_restaurant_nearby_payment AS nearby_active_user, pa.user_cnt_recommend_food_payment AS recommend_active_user, iu.first_user_cnt_search_payment AS search_cohort_user, iu.first_user_cnt_banner_payment AS banner_cohort_user, iu.first_user_cnt_food_category_payment AS category_cohort_user, iu.first_user_cnt_restaurant_nearby_payment AS nearby_cohort_user, iu.first_user_cnt_recommend_food_payment AS recommend_cohort_user, ROUND(SAFE_DIVIDE(pa.user_cnt_search_payment, iu.first_user_cnt_search_payment), 3) AS retention_week_rate_search_payment, ROUND(SAFE_DIVIDE(pa.user_cnt_banner_payment, iu.first_user_cnt_banner_payment), 3) AS retention_week_rate_banner_payment, ROUND(SAFE_DIVIDE(pa.user_cnt_food_category_payment, iu.first_user_cnt_food_category_payment), 3) AS retention_week_rate_food_category_payment, ROUND(SAFE_DIVIDE(pa.user_cnt_restaurant_nearby_payment, iu.first_user_cnt_restaurant_nearby_payment), 3) AS retention_week_rate_restaurant_nearby_payment, ROUND(SAFE_DIVIDE(pa.user_cnt_recommend_food_payment, iu.first_user_cnt_recommend_food_payment), 3) AS retention_week_rate_recommend_food_payment FROM PIVOTED_ANALYSIS pa, INITIAL_USERS iu ORDER BY pa.diff_of_week; 1000자 이내로 작성해야 게시글 하나를 쓸 수 있음..screen_view -> screen_view -> click_login의 경우, 사용자가 로그인을 하지 않고, 앱이 잠시 백그라운드 상에 동작중인 상태에서, 다시 앱을 켰을 때, screen_view 로그가 찍히는 것을 확인했습니다.현재 집중해야 할 부분은 사용자가 상품을 들여다보는 시간이나, item을 찾을 때, UI/UX 적으로 개선할 부분이 있는지 찾기보다, click_payment를 하기까지의 주요 이벤트 여정을 세그먼트로 분류하는 작업을 하고 있기 때문에, screen_view 이벤트는 제외해야겠다는 생각을 했습니다.또한, screen_view -> click_login -> screen_view -> screen_view -> click_login 처럼, 이전 이벤트와 현재 이벤트가 같은 경우를 제외한 다른 경우만을 필터링해서, 굵직한 이벤트만을 필터링해보자! 라는 생각을 가졌었습니다.--- 1000자 이내로 작성해야 글이 올ㅠ 퍼널의 수가 열 몇개로 나오지 않을까? 하는 예상과 다르게 총 433개의 단계가 나왔습니다. click_login -> click_food_category -> click_restaurant -> click_food -> click_cart -> view_recommend_extra_food -> click_payment와 같이 click_login ----- > click_payment까지의 여정의 가짓수가 너무 많아, 단계를 단순화할 필요성이 있어보였습니다. 그래서, 위의 결과와 같이 총 5개로 퍼널을 나누었습니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
5-6 1번 문제 풀이법
안녕하세요 카일스쿨님!5-1번 문제를 아래와 같이 SQL을 작성해 풀어보았는데요.답이 나오질 않았습니다.혹시 해당 쿼리에 어떤 문제가 있어 답이 나오지 않았을지 여쭤봅니다.감사합니다!
-
해결됨초보자를 위한 BigQuery(SQL) 입문
Bigquery내 SQL의 상호범용성 질문!
안녕하세요 카일스쿨님!카일스쿨님께서 만들어주신 해당 교육 너무 너무 잘 듣고 있습니다.설명도 알기 쉽게 너무 잘 해주시고, 이론적으로 배웠던 부분 실무에서도 사용할 수 있도록 예제 출제와 풀이도 같이 해주셔서 정말 탄탄하게 학습하고 있는 것 같습니다.다만, 제가 공부하면서 궁금한 지점이 있어 이렇게 질문 글을 남깁니다.저는 SQL공부를 위해서 해당 강의를 시청하고 있는데요!혹시 빅쿼리에서 사용하는 SQL문법이나 SQL작성방법이 MYSQL이나 ORACLE에서는 많이 다를까요?아니면 서로 범용할 수 있을까요?SQL 공부를 하기 위해 해당 강의를 듣고 있는데, 혹시나 빅쿼리에 한정된 공부를 하고 있는지 궁금해서 질문 남깁니다.좋은 강의자료와 강의, 그리고 질문에 대한 빠른 답변 항상 정말 감사합니다.날씨 더운데 건강 조심하시고, 저도 빠르게 기본강의 듣고 활용으로 넘어가고 싶습니다!감사합니다!
-
해결됨초보자를 위한 BigQuery(SQL) 입문
base.yml 파일까지는 찾았는데, 이후에 막혔어요
파일을 찾은 후에 편집을 하려고 더블 클릭을 하는데, 열 수 있는(?) 방법을 모르겠습니다. 뭔가를 따로 더 설치해야하나요?
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
파이썬으로 다루는 MySQL
커리큘럼을 따라 잘 수강하고 있었는데 파이썬으로 다루는 MySQL부터 파이썬이 나와서 이해를 많이 못하고 있는 것 같습니다. 강의중에는 따로 설명하는 강의를 준비했다고 하시고 파이썬 입문과 크롤링 부트캠프으로 설명드렸다고 말씀해주셨는데 여기서부터는 강사님께서 강의하시는 파이썬 강의를 듣고 나서 수강하면 좋은건가요? 제가 business analyst로 이직 희망하고 있어서 SQL을 공부하고 있는건데 파이썬과 크롤링까지 할 필요가 있을지 의문이 들어서 질문남깁니다!
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
JOIN 활용 SQL 연습문제
연습문제메인 카테고리별로 할인 가격이 10만원 이상인 상품이 몇개 있는지를 출력해보기 (JOIN 활용 SQL 과 서브쿼리 활용 SQL 모두 작성해보기)정답은 첫번째 코드처럼 WHERE, GROUP BY절이 쓰였는데 저는 처음 이 문제를 보고 두번째 코드처럼 GROUP BY, Having 절을 생각해서 넣었더니 오류값이 나오더라구요 HAVING절이 GROUP BY 이후에 자주 쓰이기도 하고 집계도 넣을 수 있어서 똑같은 조건문을 WHERE 대신 HAVING절에 넣어줬는데 혹시 오류가 난 이유가 있을까요? 오류메세지는 Unknown column 'items.dis_price' in 'having clause'라고 떴습니다. 제가 GROUP BY가 쓰일때는 HAVING이랑 WHERE가 같은 역할을 하는것 같다고 생각하는데 어떤 부분에서 차이가 있는지 설명해주시면 좀 더 분명하게 이해할 수 있을 것 같습니다.SELECT ranking.main_category, COUNT(*) FROM ranking JOIN items ON items.item_code = ranking.item_code WHERE items.dis_price >= 100000 GROUP BY ranking.main_category;SELECT ranking.main_category, COUNT(*) FROM ranking JOIN items ON items.item_code = ranking.item_code GROUP BY ranking.main_category Having items.dis_price >= 100000;
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
Dbeaver 라는 SQL 쿼리 실행 툴을 써도 될까요?
업무에선 Dbeaver로 자주 돌렸거든요.혹시 Workbench 말고 디비버도 괜찮을까요?
-
해결됨초보자를 위한 BigQuery(SQL) 입문
Espanso 설치 후 터미널에서 편집 후 저장이 안됩니다(ESC :wq가 안먹어요.)
현재 이렇게까지 입력해놓은 상태인데,이 이후 ESC :wq가 인식이 안되고 ESC 누르고 콜론을 입력하면 에러 사운드가 뜨면서 밑에 Unknown Command 라는 안내 메시지가 뜹니다.어떻게 저장을 할 수 있을까요??
-
해결됨SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법
부록 영상 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.2:40 결과를 보도록 하겠습니다2:46 이제 SQL 서버의 기본 동작부터 보도록 하시죠 영상에서 2:40 -> 2:46 로 넘어가는 부분이 이해가 안 됩니다 ㅠㅠ 혹시 중간에 영상이 잘린 건가요??
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL
INNER JOIN 할 때 NULL 값이 안보일 수도 있나요?
저는 빈칸으로만 나오는데 null 값 표시가 따로 되지는 않네요
-
해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
실행 계획 type / 정렬 방식
안녕하세요 강사님! 실행 계획 type에 대해서 궁금한 점이 있습니다. ref가 UNIQUE가 아닌 컬럼의 인덱스를 사용한 경우라고 해주셨는데, 그러면 UNIQUE가 아닌 컬럼의 인덱스이지만 index나 range의 경우에 해당하면 해당 타입으로 표시되는 거고 저 둘(index, range)이 아닐 때, ref 타입으로 표시되는 걸까요? 그리고 한 가지 더 궁금한 점이 있는데, 만약 데이터를 조회한 결과들을 바로 View로 보내는 게 아니고 자바 코드를 사용한 계산을 통해 가공해야 하는 상황이라면 굳이 ORDER BY를 쓰지 않고, 데이터 조회 후, Collections.sort()와 같은 자바 코드로 정렬하는 편이 나을까요?
-
미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
SET4의 3번 자리바꾸기 문제 다른 풀이
선생님 강의 듣기 전에 나름대로 짱구를 굴려서 풀어 봤는데기본적으로 case when ~~~ 는 똑같지만lag, lead 함수를 활용해서 해도 문제 풀 수 있었어서공부하시는 분들과 같이 공유합니다.select id , case when mod(id, 2) = 1 and id in (select max(id) from seat) then student when mod(id, 2) = 0 then lag_stu when mod(id, 2) = 1 then lead_stu end as student from ( select a.id , a.student , lag(a.student) over(order by id) as lag_stu , lead(a.student) over(order by id) as lead_stu from seat a where 1=1 ) a where 1=1 order by 1
-
미해결SQL 시작도 못한 분들 드루와요
컬럼 추출이 안됩니다...!ㅠ
SELECT, FROM, ORDER BY, LIMIT 실습 파트 중입니다!mbtitest 테이블을 mbti_test로 다르게 설정하기는 했지만 다른 부분에 있어서는 동일하게 진행했습니다!그런데 컬럼 추출하려니까 에러가 떠서요그레이브를 잘 못 입력했나 싶기는 한데... 한 번 봐주시면 감사드리겠습니다!🙏T, F, ORDER BY, LIMIT 실습T,M, ORDER BY, LIMIT 실습
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
Sakila PDF 파일 오류
안녕하세요 Sakila 관련 PDF파일 네 파일 모두다 위에 열수 없다는 메세지가 뜹니다. 혹시 다시 올려주실 수 있나요?
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
SQL table에 있는 Default 의미
SQL table을 생성하면 Field, Type, Null, Key, Default, Ext순으로 있는데 Field, Type, Null, Key, Ext은 테이블 만들때 다 다뤘던거라 알겠는데 Dafult는 항상 NULL이라고 되어있는데 어떤건지 잘 모르겠더라구요. 그리고 NOT NULL이라고 데이터 형식을 적으면 NULL 에 Yes라고 뜨는데 Default에는 NULL이라고 되어있어서 가끔 헷갈리기도 하는 것 같아요. Default가 의미하는게 무엇이고, 왜 항상 NULL이라고 되어있는지 궁금합니다
-
해결됨초보자를 위한 BigQuery(SQL) 입문
4-5 시간 데이터 연습 문제 3번 질문
카일님, 안녕하세요! 시간 데이터 3번 문제 궁금한게 있어 질문드립니다.저는 해당 문제를 서브쿼리 없이 작성했는데, 서브쿼리 없이 작성해도 문제가 없나요?그리고 서브쿼리는 어떤 경우에 사용해야 하는지 기준이 있을까요??SELECT trainer_id, FORMAT_DATE("%d/%m/%Y", MIN(DATE(catch_datetime, 'Asia/Seoul'))) as first_date FROM basic.trainer_pokemon GROUP BY trainer_id ORDER BY trainer_id;