묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
강의 자료 파일을 열 수 없습니다.
윈도우 사용자입니다. 첨부파일을 다운로드 받았는데, 압축파일 풀기를 하면 아래와 같이 오류 메시지가 나오는데요. 어떻게 해결하면 좋을까요?
-
해결됨[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
인덱스 관련 질문!
인덱스에 대해서 약간의 의문을 질문드립니다. 인덱스가 조회의 성능 향상을 위한다는 점은 이해가 갑니다만..특정한 인덱스의 이름을 설정하는 부분이 약간 헷갈립니다. 가령 std_id 라는 인덱스를 학번을 저장 하는 column에 만들었을 때를 예시로 들겠습니다. 제가 학번의 데이터를 조회 하는경우 자체 프로그램에서 std_id의 인덱스만을 쉽게 찾는다는 의미이며, 이름설정은 단순 사용자들의 이해를 편하게 하기 위함인지가 궁금합니당
-
해결됨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 인 경우데이터 중복이 없을 경우에는, 같은 값이 나옵니다.
-
해결됨SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법
섹션2 조건절 상수화 이슈(로컬변수, 사용자정의함수), 테이블 변수 최적화 이슈
1) index 열에 조건으로 로컬변수를 사용하면 안되는데매개 변수는 된다는게 좀 희한하네요혹시 이 부분 관련해서 참조할 수 있는 사이트가 있을까요?2) 그리고 12분부터 테이블 변수 사용 예를 들어주셨는데일반 테이블을 사용했을떄는 Order Detais 테이블 검색 후Orders 테이블하고 결합한다고 설명해주셨는데====================================SELECT TOP(5) *FROM dbo.Orders AS o INNER JOIN dbo.[Order Details] AS dON o.OrderID = d.OrderIDWHERE d.ProductID < 2====================================테이블 변수(@Orders)를 사용했을때는@Orders를 먼저 처리하고 Order Details을 처리한다고 해주셨는데이게 문제인 이유는 @Orders 를 먼저 검색하게 되면 where 조건이쓸모 없게 되어 인건가요?====================================SELECT TOP(5) *FROM [Order Details] AS d INNER JOIN @Orders AS oON o.OrderID = d.OrderIDWHERE d.ProductID < 2====================================
-
해결됨SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법
쿼리 튜닝 관련 강의는 ..
쿼리 튜닝 관련 교육은 이걸 보면 되나요?https://www.inflearn.com/course/sql-%EC%BF%BC%EB%A6%AC%EB%8A%A5%EB%A0%A5
-
해결됨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로 하나하나 데이터 넣으라는데... 예전에 프로젝트 할 때, 이 방법으로 했다가 돈이 꽤 나와서요.. 어떻게 해야할까요?
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
지마켓파일 DBeaver(디비버) 에서 실행하는 방법
안녕하세요 🙂 DBeaver(디비버) 툴에서 실습을 진행하고 싶은데 ㅜㅜ제공해주신 [ 지마켓 SQL ] 파일 실행시키는 방법에 대해 도움 받을 수 있을까요?감사합니다.
-
미해결[백문이불여일타] 데이터 분석을 위한 기초 SQL
'' 필요한 이유가 뭔가요? 'customerid>=3 AND customerid=<5'
본 영상에서는 ''을 붙이지 않아도 문제가 없던데 Error in SQL: Syntax error (missing operator) in query expression 'customerid>=3 AND customerid=<5' 이렇게 뜨네요 조건이 바뀐건가요?
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
섹션 1, 2의 강의자료를 못찾겠어요
[꼭 들어주세요] 강의 자료 다운로드 관련다운로드를 했는데 압축파일안에 강의자료가 없는 것 같아요 ㅠㅎ
-
미해결데이터 분석 SQL Fundamentals
Join on 순서 관련 질문드립니다.
sql을 시작할 때 체계적으로 공부하지 못해서 기초적인 질문일 수도 있는데 해답을 못 찾았습니다 ㅜㅜjoin 문 사용 시 on 뒤의 컬럼 순서에 따라서도 sql문 결과값이 다른지 궁금합니다. 예를 들어,select * from tablea a join tableb b on a.product_id = b.product_id 2. select * from tablea a join tableb b on b.product_id = a.product_id두 sql문을 실행했을 때 차이가 있을까요?현업에서 2번 형태를 많이 본 것 같아서 혹시 차이가 있다면 어떤 차이인지 설명해주시면 감사하겠습니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
5-6 1번 문제
안녕하세요. where에 조건을 걸기 전에 조인하고 한번 해봤는데 결과 갯수가 차이가 있습니다. 어떤 부분 때문에 이런 차이가 발생할까요?
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
회사노트북 보안
안녕하세요 회사노트북에 My SQL과 Anaconda (주피터노트북)을 다운받아서 연습해보려고 하는데 혹시 이렇게 사용해도 따로 자료 유출이나 보안적인 부분에서 이슈가 될만한 사항은 없겠죠? 주피터 노트북을 다운받고나니 회사 노트북에 One drive에 저장된 모든 문서가 떠서 좀 당황스러워서 확인차 여쭤봅니다!
-
미해결Do it! SQL 입문
테이블 서로 통합하는 조인 알아보기(2) _ like '%Micro%' 관련 질문
like '%Micro%' 하고 나면 symbol에 해당 Micro가 포함된 심볼이 나와야 할텐데 왜 결과값이 MCHP 이런것들이 나오는지.. 정말 이해가 안갑니다 ㅠ
-
해결됨[백문이불여일타] 데이터 분석을 위한 중급 SQL
new_category 그룹핑 시 에러 (밑에분과 동일)
밑에 질문하셨던 분이랑 동일한 현상이 발생하는데 이거 사이트 새로고침해도 안되는데 뭐가 문제인건가요...?뿐만 아니라 아래와 같이 이전 강의에서도 강의랑 코드 똑같이 썼음에도 불구하고 HAVING 절에 별칭을 쓰면 에러가 나는 현상도 발생합니다.(having절에 avg_price 대신 AVG(Price) 작성 시 에러 발생 없이 정상적으로 결과가 나옵니다.)위처럼 강의랑 똑같이 코드 작성했는데도 에러가 발생하는 부분은 그냥 해당 사이트 버그로 간주하고 넘어가면 되는걸까요..?
-
해결됨SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법
메시지 창 관련 문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.수업의 14:23 을 참고하면 메시지 창에 스캔수, 논리적 읽기, 실제 읽기, ... 등값 들이 보이는데 제 화면의 메시지창에는 (8개 행이 영향을 받음)이것밖에 안뜹니다 ㅠㅠ보이도록 하는 방법이 궁금합니다
-
미해결SQL 개발자 (SQLD) 자격증 따기 Part.1
[오류발생]설치가 안됩니다oracle database rollback
이렇게 뜨면서 설치가 안되는데, 어떻게 해야 하나요?
-
미해결데이터 분석 SQL Fundamentals
조인실습-04 관련 질문있습니다.
안녕하세요, 유용한 강의 너무 감사합니다. 실습-04에서 category_name = 'Beverages'인 상품 정보를 불러오는 문제에서 결과값이 상이해 질문드립니다.아래와 같이 조인문을 실행했을 때 결과값이 3행만 나오는데 어떻게 수정해야 할까요?select a.category_name , b.product_id , b.product_name , c.company_namefrom nw.categories ajoin nw.products b on a.category_id = b.category_idjoin nw.suppliers c on b.supplier_id = c.supplier_idwhere a.category_name = 'Beverages'