묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨8시간 완성 SQLD(2과목)
질문드려요
-- P.123 115번CREATE TABLE board(board_id varchar(10) NOT NULL PRIMARY KEY,board_nm varchar(50) NOT NULL,use_ym varchar(1) NOT NULL,reg_date DATE NOT NULL,board_desc varchar2(100) NULL); INSERT INTO BOARD(board_id, board_nm, use_ym, reg_date) VALUES(1, 'Q&A', 'Y', SYSDATE);위에 INSERT INTO문 무결성 제약조건 오류가 뜨는데.114번의 INSERT INTO TBL(ID, AMT) VALUES(3, 300); 이건 되는데 왜 115번은 안되는지 궁금합니다
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
리텐션 과제 작성
안녕하세요. 리텐션 과제 작성하여 노션 링크 첨부하였습니다.제가 다른 분야에서 업무를 하다가 앱 로그 데이터를 처음 다뤄보게 되었는데 어려운 점이 많네요.. ㅠ 과제를 진행하면서 모르겠는 점도 있고 해서 먼저 피드백을 받고 다시 진행해보려고 합니다.좋은 강의 만들어주셔서 감사합니다!https://www.notion.so/staticstic/880f80adb2d7414e8cfa417512b263d4?pvs=4
-
미해결다양한 사례로 익히는 SQL 데이터 분석
특정 스키마에서 생성한 편집기의 쿼리를 판다스에 삽입하는 방법
안녕하세요,디비버 실습시 nw스키마에서 SQL편집기를 생성하여 코드를 작성중입니다.따라서 select * from orders; 와 같이 nw.orders대신 그냥 orders로 테이블을 지정(?)하고있습니다.해당 쿼리를 그대로 복사하여 query객체에 넣고싶은데이럴땐 conn_string에 어떤 추가적인 사항을 넣어줘야 할까요?
-
해결됨8시간 완성 SQLD(2과목)
질문드려요
안녕하세요 76번 질문드립니다.sum(C2) 는 이해가 되는데 뒤에 붙은 C2는 어떤 의미인건가요?AS라면 sum에 왜 AS를 붙인건지 궁금합니다.
-
해결됨8시간 완성 SQLD(2과목)
안녕하세요
delete cascade로 설정된 T와 S테이블에서T테이블의 C 컬럼이 삭제 되면S테이블의 C컬럼의 1과 매칭되어서 연쇄 삭제되는건 이해했는데,S테이블의 B컬럼은 남아있을거라고 생각했었는데, C컬럼을 삭제하면 다른 컬럼(S테이블의 B)도 같이 삭제되나요?
-
해결됨8시간 완성 SQLD(2과목)
3개 테이블 조인
SELECT A.PLAYER_NAME,B.REGION_NAME,B.TEAM_NAME,C.STADIUM_NAMEFROM PLAYER A, TEAM B, STADIUM CWHERE B.TEAM_ID=A.TEAM_ID ANDC.STADIUM_ID=C.STADIUM_ID위에 코드에서 C.STADIUM_ID=C.STADIUM_ID 이건 왜 해주는건가요? 항상 참인데 3개 테이블과 연결하는 데 있어서 어떤 의미가 있나요?
-
미해결8시간 완성 SQLD(2과목)
노랭이 64번
2번 보기가 책과 다른거 같아요CONNECT BY 상위부서코드 = PRIOR 부서코드라 되어있어요
-
해결됨8시간 완성 SQLD(2과목)
실습환경 설정이 안되고 있습니다 ㅠㅠ (windows, 도커 방식 모두)
윈11 pro인데도 불구하고 오라클 21c는 마지막 '설치완료' 단계에서제대로 설치가 되지 않았다는 메시지가 뜹니다...혹시 몰라 재부팅 후 다시 설치해보아도 결과는 같구요...설치 경로상 한글이나 공백 없는데도 그렇습니다 ㅠ docker run 명령어 단계에서 아래와 같이 나옵니다비슷한 질문글에 해주신 답변을 따라 한 줄로 입력해보기도 했는데 아래처럼 나오구요..
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-7. Weekly 리텐션 쿼리 작성 및 질문
안녕하세요.Weekly로 리텐션 쿼리 아래와 같이 작성해 보았습니다.한가지 질문할 점은 event_week 기간 동안 한번 이상 접속을 한다고 하더라도 user_psuedo_id는 한번으로 집계되는지 궁금합니다!그리고 작성한 쿼리문을 좀 더 나은 방향으로 수정하면 좋은 방향이 있다면 언제든 말씀 부탁드릴께요! 강의 정말 잘 듣고 있습니다 :)===작성한 쿼리문===WITH base AS ( SELECT DISTINCT user_id, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul")) AS event_date, user_pseudo_id FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), diff_of_week_data AS ( SELECT *, DATE_DIFF(event_week, first_week, week) AS diff_of_week FROM( SELECT DISTINCT user_pseudo_id, MIN (DATE_TRUNC(event_date,WEEK(MONDAY))) OVER (PARTITION BY user_pseudo_id) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ) SELECT *, SAFE_DIVIDE(cnt, first_value_cnt) AS retention_ratio FROM( SELECT *, FIRST_VALUE(cnt) OVER (ORDER BY diff_of_week) AS first_value_cnt FROM( SELECT diff_of_week, COUNT(user_pseudo_id) AS cnt FROM diff_of_week_data GROUP BY diff_of_week ) ) ORDER BY diff_of_week
-
해결됨8시간 완성 SQLD(2과목)
55번 문제 질문이요
55번문제에 1번 보기는 중복때문에 안된다고 하셨는데 2번 보기도 중복이 존재 할 수 있는거 아닌가요?
-
해결됨8시간 완성 SQLD(2과목)
partition by와 헷갈려서 질문드립니다!
윈도우 함수와 group by절을 함께 사용한 것은 윈도우함수에서 partition by를 사용한 것으로 보면 되는건가요??
-
해결됨8시간 완성 SQLD(2과목)
58 87 69번 문제가 나오지 않습니다
58 87 69번 문제가 나오지 않습니다
-
해결됨8시간 완성 SQLD(2과목)
WHERE절과 차이 질문
WHERE절이 GROUP BY 집계 이전에 실행되기 때문에 집계함수를 사용할 수 없다라고 하셨는데 WHERE절이 그룹화와 집계함수 이전에 실행된다는 말인가요? 아니면 GROUP BY절 이전에 WHERE절이 실행된다는 말인가요??
-
미해결SQL 개발자 (SQLD) 자격증 따기 Part.1
강의 자료는 어디서 찾을 수 있나요?
강의 자료는 어디서 찾을 수 있나요?다운로드 받아 인쇄후 교육 받으려 합니다.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
리텐션 분석 과제
리텐션 분석 과제 노션 문서에 정리해서 공유드립니다~문서 링크
-
해결됨8시간 완성 SQLD(2과목)
동영상 처럼 오른쪽에 SQL server 실행도 하려면 어떻게 해야되나요?
이 방법이 맞는지는 모르겠는데 맞다면여기서 어떻게 해야되는지 모르겠네요
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-13 4번 문제 풀어보았습니다
4. Core Event를 "click_payment"라고 설정하고 Weekly Retention을 구해주세요. WITH base AS( SELECT event_date, event_timestamp, user_pseudo_id, event_name, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen, MAX(IF(ep.key = 'food_id', ep.value.int_value, NULL)) AS food_id, MAX(IF(ep.key = 'session_od', ep.value.string_value, NULL)) AS session_od FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep GROUP BY ALL ), payment AS( SELECT user_pseudo_id, event_timestamp, event_date, event_name, --firebase_screen, FROM base WHERE event_name = 'click_payment' ORDER BY event_date ), payment_first_week AS( SELECT *, 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( SELECT * EXCEPT(event_timestamp, event_date), DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date FROM payment ) ), payment_user_cnt AS( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM payment_first_week ) GROUP BY diff_of_week ORDER BY diff_of_week ) ############################### 리텐션 비율 구하기 ############################### SELECT *, SAFE_DIVIDE(user_cnt, first_week_user_cnt) AS retention_rate FROM( SELECT *, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week) AS first_week_user_cnt FROM payment_user_cnt ) 여기까지는 payment 테이블 WHERE절에 event_name으로 "click_payment" 조건을 걸어준 것 빼곤 강의의 코드를 거의 그대로 사용했습니다. 결과는 이렇게 나왔고, 저는 diff_of_week가 4일 때 갑자기 user_cnt가 상승했다가 5일 때 다시 이전 수치로 돌아간 것에 주목했습니다(약 18% 상승). SELECT event_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM payment_first_week ) WHERE diff_of_week = 4 GROUP BY event_week ORDER BY user_cnt DESC 그래서 diff_of_week가 4일 때의 "click_payment" 이벤트를 발생시킨 유저의 수를 추출해보았습니다. 결과를 보았을 때, 2022-10-31 ~ 2023-01-09의 유저 수가 많음을 확인하였고 이는, 해당 기간이 첫 주문 후 4주가 지난 사람들의 재주문 건수가 많았을 것이라는 생각이 들었습니다. ##################### 해당 날짜, 이전, 이후의 데이터 추출 #################### # target_date 테이블: 해당 날짜를 만족하는 행만 추출 , target_date AS( SELECT * FROM base WHERE user_pseudo_id IN( SELECT user_pseudo_id FROM payment_first_week WHERE first_week BETWEEN '2022-10-03' AND '2022-12-12' ) ORDER BY user_pseudo_id, event_timestamp # before_target_date 테이블: 해당 날짜 이전 ), before_target_date AS( SELECT * FROM base WHERE user_pseudo_id IN( SELECT user_pseudo_id FROM payment_first_week WHERE first_week BETWEEN '2022-08-01' AND '2022-10-02' ) ORDER BY user_pseudo_id, event_timestamp # after_target_date 테이블: 해당 날짜 이후 ), after_target_date AS( SELECT * FROM base WHERE user_pseudo_id IN( SELECT user_pseudo_id FROM payment_first_week WHERE first_week BETWEEN '2022-12-13' AND '2023-12-31' ) ORDER BY user_pseudo_id, event_timestamp ) ################ click_payment를 발생시킨 유저와 그 때의 날짜 추출 ################ # payment_users 테이블: 해당 날짜에서 event_name칼럼에 "click_payment"를 가지고 있는 user_pseudo_id와 그 때의 event_date를 추출 , payment_users_target_date AS( SELECT event_date, user_pseudo_id FROM( SELECT *, CASE WHEN event_name = 'click_payment' THEN 1 ELSE 0 END AS payment_user FROM target_date ) WHERE payment_user = 1 ) # payment_users_before 테이블: 해당 날짜 이전의 payment user의 정보 ,payment_users_before AS( SELECT event_date, user_pseudo_id FROM( SELECT *, CASE WHEN event_name = 'click_payment' THEN 1 ELSE 0 END AS payment_user FROM before_target_date ) WHERE payment_user = 1 ) # payment_users_after 테이블: 해당 날짜 이후의 payment user의 정보 ,payment_users_after AS( SELECT event_date, user_pseudo_id FROM( SELECT *, CASE WHEN event_name = 'click_payment' THEN 1 ELSE 0 END AS payment_user FROM after_target_date ) WHERE payment_user = 1 ) 그래서 전체 날짜를 위의 해당 날짜와 그 전, 후 3개로 나누어 해당 기간의 정보만을 담는 테이블을 생성하고, 각 기간에 "click_payment" 이벤트를 가지고 있는 유저의 user_pseudo_id와 그 때의 event_date를 추출하였습니다.################ 3개의 기간동안 사람들이 주문한 음식의 food_id 추출 ################ # 해당 기간동안 사람들이 주문한 food_id , food_cnt_target_date AS( SELECT food_id, COUNT(*) AS food_cnt FROM target_date td JOIN payment_users_target_date pu ON td.user_pseudo_id = pu.user_pseudo_id AND td.event_date = pu.event_date WHERE event_name = "click_cart" GROUP BY food_id ORDER BY food_cnt DESC --ORDER BY td.user_pseudo_id, event_timestamp ), # 해당 기간 이전 사람들이 주문한 food_id food_cnt_before_target AS( SELECT food_id, COUNT(*) AS food_cnt FROM before_target_date td JOIN payment_users_before pu ON td.user_pseudo_id = pu.user_pseudo_id AND td.event_date = pu.event_date WHERE event_name = "click_cart" GROUP BY food_id ORDER BY food_cnt DESC ), # 해당 기간 이후 사람들이 주문한 food_id food_cnt_after_target AS( SELECT food_id, COUNT(*) AS food_cnt FROM after_target_date td JOIN payment_users_after pu ON td.user_pseudo_id = pu.user_pseudo_id AND td.event_date = pu.event_date WHERE event_name = "click_cart" GROUP BY food_id ORDER BY food_cnt DESC ) 위에서 구한 id와 date를 이용해 세 기간동안 사람들이 주문한 음식과 음식 별 건수를 추출하였습니다. 전체 데이터를 살펴본 결과, "click_payment"는 항상 주문 마지막에 발생하는 이벤트이며, 이 row에는 food_id는 없고, "click_cart" 이벤트를 발생시켰을 때 해당 주문건에 대한 food_id가 row에 포함되어 있어 event_name을 "click_cart"로 지정하였습니다. ################ 각 food_id 별 해당 기간, 이전, 이후의 주문 건수 카운트 ################ , total_cnt AS( SELECT td.food_id, btd.food_cnt AS food_cnt_before_target_date, td.food_cnt AS food_cnt_target_date, atd.food_cnt AS food_cnt_after_target_date FROM food_cnt_target_date td JOIN food_cnt_before_target btd ON td.food_id = btd.food_id JOIN food_cnt_after_target atd ON td.food_id = atd.food_id ) ################ 각 food_id 별 해당 기간, 이전, 이후의 주문 건수 비율 ################ SELECT food_id, food_cnt_before_target_date, ROUND(SAFE_DIVIDE(food_cnt_before_target_date, SUM(food_cnt_before_target_date) OVER()), 4) AS rate_before, food_cnt_target_date, ROUND(SAFE_DIVIDE(food_cnt_target_date, SUM(food_cnt_target_date) OVER()), 4) AS rate_target, food_cnt_after_target_date, ROUND(SAFE_DIVIDE(food_cnt_after_target_date, SUM(food_cnt_after_target_date) OVER()), 4) AS rate_after FROM total_cnt ORDER BY rate_target DESC세 기간동안 사람들이 주문한 food_id와 그 횟수, 비율을 구해보았습니다. 각 음식의 비율은 매우 적지만 target_date를 기준으로 정렬해 보았을 때, 확실히 해당 기간동안 주문량이 높고 나머지 기간에는 주문량이 낮은 음식들이 존재했습니다(ex. 1438, 1516 등). 하지만, 이것이 4주전 주문자들의 실제 재주문 결과인지, 단지 해당기간 동안 신규 유저가 늘었기 때문인지 확실하지 않다고 생각문자와 그 외 기간동안의 신규 주문자를 비교해 보았습니다. SELECT new_user_target_date, COUNT(*) AS new_user_cnt FROM( SELECT CASE WHEN first_week BETWEEN '2022-10-31' AND '2023-01-09' THEN 1 ELSE 0 END AS new_user_target_date FROM payment_first_week ) GROUP BY new_user_target_date 해당 기간의 신규 유저수는(new_user_target_date = 1) 6261명, 그 외 기간의 신규 유저수는 6898명으로, 전체 기간 대비 해당 기간의 비율을 고려해보았을 때, 신규 유저가 크게 늘었다고 보기 어려웠습니다. 따라서, 2022~10-03 ~ 2022-12-12일이 포함된 주차에 첫 주문을 한 고객들의 만족도가 높았거나, 그 당시에 시행했던 첫 주문 관련 마케팅, 광고 효과가 좋았을 것이라고 판단할 수 있었습니다. ** 앱 로그 데이터를 처음 접했기 때문에 코드 오류나 논리적인 비약이 있을 것이라고 생각하지만, 단지 Weekly Retention에 WHERE 조건을 추가하는 것에 그치기 아쉬워서(?) 의식의 흐름대로 분석해보았습니다.
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
jpa쿼리튜닝 팁이 궁금합니다.!
안녕하세요 강의 잘 듣고 있습니다!jpa를 사용해서 프로젝트를 진행하면 쿼리 메서드를 사용할텐데 select * <- 이걸로 넓은 범위를 조회할텐데jpql로 다 작성해주어야 하나요?jpa로 프로젝트 진행할때 팁이나 검색 키워드 추천해주세요!
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
Join 구문에서 메인 테이블
SELECT provider FROM items JOIN ranking on ranking.item_code = items.item_code 여기서 items 위치를 메인 테이블ranking 위치를 서브 테이블이라고 칭할게요! 메인테이블과 서브테이블을 어떤걸로 해야할지 항상 헷갈려요기본적으로 보고 싶은 컬럼인 provider가 원래 속한 테이블을 메인에 두려고는 하는데 예제 풀어주시는 걸 보면 아닌 경우도 있어서요! 어차피 테이블을 조인하는거니까 하나의 테이블이 되면 뭐가 메인이 되어도 상관이 없지않나 싶은데..메인 테이블 지정하는 기준이 있나요??
-
해결됨8시간 완성 SQLD(2과목)
db다운로드 (EMP,KLEAGUE 데이터 세트 로드)
--질문--말씀하신것처럼 DB실행을 하니 ORA-00901 CREATE명령어가 부족합니다 라고 뜨면서 insert가 되지 않습니다.테이블도 데이터도 생성되지 않습니다..ㅠㅠ