공부하고 전파하는 것을 좋아합니다. 빅데이터와 인공지능에 오랜 경력이 있습니다.
20년 현업 데이터분석가 경력, 5년 데이터 분석 강의!
빅데이터 및 인공지능 분야 기업 및 공공기관 자문 및 출강
빅데이터 분석기사 한권완성 필기, 실기 저자
인공지능 분야 스타트업 대표
講義
受講レビュー
- [2025] SQLD問題が難しいあなたのためのノランイ176問題解説
- [2025] 非専攻者でも一発合格するSQLD オールインワン
- [2025] 非専攻者でも一発合格するSQLD オールインワン
投稿
Q&A
실전문제 2회차 24번문제
안녕하세요. kokodae.ko 님. 질문 주셔서 감사합니다. 질문에 답을 드리자면.. 24번 문제는 아래와 같고, 문제에서 요구하는 것은 '연속된 3일 이상' 입니다.24. 아래의 테이블에서 연속된 3일 이상 결제금액이 10만원을 초과한 고객을 찾으려고 한다. 가장 적절한 SQL문은? 문제에서 요구하는 '3일 이상' 이라는 기준으로 접답을 찾으면 3번입니다. 보기 1번은 3일 '이상' 이라는 기준을 충족하기 어렵습니다. 작성된 쿼리는 정확히 3일을 기준으로 데이터를 조회하게 되어 있습니다. 보기 3번은 3일 이상이라는 조건을 충족합니다. 물론 제시된 데이터만 가지고 보면, 1번도 답이 맞는 것 같다고 할 수 있습니다. 하지만 문제는 가장 적절한 것을 찾는 것이기 때문에 보기 중에서 가장 적절한 것을 선택하는 것이 좋습니다. 아래는 24번 문제의 실습 데이터와 쿼리입니다. 문제에서 제시된 데이터 외에 추가로 몇 건을 더 입력합니다. 실습 해보시면, 이해가 더 잘 되실 겁니다. CREATE TABLE PAYMENT ( CUSTOMER_ID VARCHAR(10) NOT NULL, PAYMENT_DATE DATE NOT NULL, AMOUNT INT NOT NULL, PRIMARY KEY (CUSTOMER_ID, PAYMENT_DATE) ); INSERT INTO PAYMENT (CUSTOMER_ID, PAYMENT_DATE, AMOUNT) VALUES ('A001', DATE '2024-01-01', 120000), ('A001', DATE '2024-01-02', 150000), ('A001', DATE '2024-01-03', 130000), -- A001은 3일 연속 (1/1~1/3) 조건을 만족 ('A001', DATE '2024-01-04', 80000), -- 10만원 이하로 연속 종료 ('A002', DATE '2024-01-01', 110000), ('A002', DATE '2024-01-02', 90000), -- 10만원 이하로 연속 실패 ('A002', DATE '2024-01-03', 120000), ('A003', DATE '2024-01-05', 110000), ('A003', DATE '2024-01-07', 120000), -- 1일씩 간격이 있어 연속 실패 ('A003', DATE '2024-01-09', 130000), ('A004', DATE '2024-02-10', 105000), ('A004', DATE '2024-02-11', 106000), ('A004', DATE '2024-02-12', 107000), ('A004', DATE '2024-02-13', 108000); -- A004는 4일 연속 (1/10~1/13) 조건을 만족 -- DBMS에 따라 DATE 'YYYY-MM-DD' 형식이 지원되지 않을 경우 TO_DATE('YYYY-MM-DD', 'YYYY-MM-DD') 등을 사용해야 할 수 있습니다. -- 1번 보기 : 정확하게 3일간 10만 이상인 데이터를 찾음. 문제에서는 3일 이상을 요구하고 있음 SELECT DISTINCT P1.CUSTOMER_ID FROM PAYMENT P1 JOIN PAYMENT P2 ON P1.CUSTOMER_ID = P2.CUSTOMER_ID JOIN PAYMENT P3 ON P2.CUSTOMER_ID = P3.CUSTOMER_ID WHERE P2.PAYMENT_DATE = P1.PAYMENT_DATE + 1 AND P3.PAYMENT_DATE = P2.PAYMENT_DATE + 1 AND P1.AMOUNT > 100000 AND P2.AMOUNT > 100000 AND P3.AMOUNT > 100000; -- 2번 보기 : 10만 이상인 고객 중 거래가 3건 이상인 고객 아이디를 반환함 SELECT CUSTOMER_ID FROM PAYMENT WHERE AMOUNT > 100000 GROUP BY CUSTOMER_ID HAVING COUNT(*) >= 3; -- 3번 : 연속된 날짜를 그룹화 하는 '차이 분석 기법' 방식 -- With 내부의 Select 구문을 실행하면, 연속된 날짜인 경우 동일한 GRP 날짜가 생깁니다. 연속되지 않은 경우 동일한 GRP 날짜가 생기지 않고요. WITH CONSECUTIVE_DAYS AS ( SELECT CUSTOMER_ID, PAYMENT_DATE, AMOUNT, ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY PAYMENT_DATE) AS RN, PAYMENT_DATE - ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY PAYMENT_DATE) AS GRP FROM PAYMENT WHERE AMOUNT > 100000 ) SELECT DISTINCT CUSTOMER_ID FROM ( SELECT CUSTOMER_ID, GRP, COUNT(*) AS CNT FROM CONSECUTIVE_DAYS GROUP BY CUSTOMER_ID, GRP HAVING COUNT(*) >= 3 ); -- 4번: 3일 이상 연속 조건을 확인하기 어려움. 금액이 10만 이상인 것 기준으로 조회 SELECT DISTINCT CUSTOMER_ID FROM ( SELECT CUSTOMER_ID, AMOUNT, LAG(AMOUNT, 1) OVER (PARTITION BY CUSTOMER_ID ORDER BY PAYMENT_DATE) AS PREV_AMOUNT, LAG(AMOUNT, 2) OVER (PARTITION BY CUSTOMER_ID ORDER BY PAYMENT_DATE) AS PREV2_AMOUNT FROM PAYMENT )일 WHERE AMOUNT > 100000 AND PREV_AMOUNT > 100000 AND PREV2_AMOUNT > 100000;
- 0
- 2
- 9
Q&A
실전문제3회 41번문제
안녕하세요. kokodae.ko 님. 질문 남겨주셔서 감사합니다. 이 문제는 가장 적절한 sql 을 찾는 문제입니다. 말씀하신 것 처럼 보기 1, 3은 해당 데이터 내에서는 동일한 결과가 나옵니다. 하지만 3번 같은 경우, Lag 에 4 라는 값을 하드코딩 해두었기 때문에 데이터가 누락된 경우에는 완전히 잘 못된 값을 출력하게 됩니다. 예를 들어 한 개 쿼터의 값이 없는 경우에도 4개 이전의 값을 가지고 계산을 하게 됩니다. 그래서 가장 적절한 sql은 1번으로 선택하는 것이 좋습니다. 물론 실제시험에서도 이런 경우가 있을 수 있습니다. 실제로 제시된 데이터를 기준으로 정답을 선택하는 것이기 때문에 3번이 정답이라고 이의를 제기할 수 있습니다. (이런 경우가 종종 존재합니다) 이의를 제기해서 점수를 받을 수도 있겠지만 리스크 관리차원에서 1번 보기를 선택하는 게 더 좋을 것 같습니다. 아래, 참고하시라고 실습 스크립트를 남겨드립니다. 이미 실습을 해보신 것 같지만, 참고하십시오. 감사합니다. -- SALES 테이블 생성CREATE TABLE SALES ( YEAR INT, QUARTER INT, AMOUNT DECIMAL(10, 0));-- 예시 데이터 삽입INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 1, 1000);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 2, 1200);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 3, 1500);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 4, 1800);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 1, 1300);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 2, 1400);-- 추가 데이터를 삽입하여 2024년 3분기/4분기 YoY 비교가 가능하도록 합니다.INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 3, 1700);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 4, 2000);commit; -- 보기1 SELECT YEAR, QUARTER, AMOUNT, LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) as PREV_AMOUNT, ROUND((AMOUNT - LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR)) / LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) * 100, 2) as GROWTH_RATEFROM SALES;-- 보기2SELECT YEAR, QUARTER, AMOUNT, LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER) as PREV_AMOUNT, ROUND((AMOUNT - LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER)) / LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER) * 100, 2) as GROWTH_RATEFROM SALES;-- 보기3SELECT YEAR, QUARTER, AMOUNT, LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) as PREV_AMOUNT, ROUND((AMOUNT - LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER)) / LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) * 100, 2) as GROWTH_RATEFROM SALES;-- 보기4SELECT YEAR, QUARTER, AMOUNT, FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) as PREV_AMOUNT, ROUND((AMOUNT - FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR)) / FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) * 100, 2) as GROWTH_RATEFROM SALES;
- 0
- 2
- 24
Q&A
실전문제 3회차 18번
안녕하세요. 질문 주셔서 감사합니다. 내용 살펴봤습니다. 문제의 보기를 작성할 때 실수가 있었습니다. 18번 문제의 정답은 1, 3번이 모두 해당 하는 것이 맞습니다. 아래 AI 인턴이 남긴 답은 1, 3번 보기의 쿼리가 모두 중복 결과를 리턴하기 때문에 부정확합니다. 실수를 알려주셔서 감사드립니다. 참고로 아래에 쿼리 실습을 할 수 있도록 스크립트를 남깁니다. 문제는 업데이트 해서 다시 올려두었습니다. 감사드립니다. -- EMPLOYEE 테이블 생성CREATE TABLE EMPLOYEE ( EMP_ID INT PRIMARY KEY, NAME VARCHAR(50), DEPT_ID INT, SALARY INT);-- 데이터 삽입INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (100, '김철수', 10, 5000);INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (200, '이영희', 10, 4000);INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (300, '박민수', 20, 4500);INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (400, '최종호', 20, 5500);-- 테이블 전체 확인 (선택 사항)SELECT * FROM EMPLOYEE;commit; SELECT * FROM EMPLOYEE WHERE (DEPT_ID, SALARY) IN ( -- 각 부서별 최대 급여와 부서 ID를 조회 SELECT DEPT_ID, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT_ID);SELECT * FROM EMPLOYEE E WHERE SALARY = ( -- 직원 E의 부서(E.DEPT_ID) 내에서 최대 급여를 조회 SELECT MAX(SALARY) FROM EMPLOYEE WHERE DEPT_ID = E.DEPT_ID);
- 0
- 2
- 24
Q&A
SQLD 자격증
안녕하세요. spb03240님. 질문 남겨주셔서 감사합니다. SQL을 공부하면 데이터를 이해하고 다룰 수 있는 기본적인 역량을 향상 시킬 수 있습니다. 빅데이터 분석 실무에는 당연히 도움이 되고 필수적입다. 하지만 자격증 획득을 목적으로 할 경우는 좀 다릅니다. 빅데이터 분석기사를 획득하기 위해서 SQL을 공부하는 것이 필수적이지는 않고 시험 범위가 겹치지도 않습니다. 물론 ADsP 처럼 SQL 문제가 간혹 나올 수도 있겠지만 나오더라도 한 두 문제라 당락에 영향을 줄 정도는 아닐거라 짐작합니다. 질문자님께서 자격증 획득에 높은 비중을 둔다면 빅데이터 분석에 바로 도전하시는 걸 권해드리구요. 데이터 관련 분야에 직업을 구하실 계획이라면 SQL을 꼭 공부하셔서 자격증도 획득하시길 권해드립니다. 참고로 저는 SQL과 빅데이터 분석에 대한 실무와 강의를 모두 하고 있다는 걸 알려드립니다. 그럼 도움이 되셨으면 좋겠구요. 행복한 날들 보내십시오. 감사합니다.
- 0
- 1
- 20
Q&A
계층형 질의 질문입니다.
안녕하세요. 질문에 아래와 같이 답변 드립니다. 답변이 도움이 되었으면 좋겠네요. 감사합니다. 다른 강의에서 Prior 자식 = 부모가 순방향이라고 하는 경우가 있나 보네요. 제가, 해당 강의를 듣지 않았기 때문에 뭐라고 말씀드리기는 어려울 거 같습니다.. 일반적으로 설명하자면, Prior 라는 키워드는 이전 행을 의미합니다. 만약 Prior empno = mgr (Prior 부모 = 자식)과 같이 작성하면, 이전 행의 사원 번호와 현재 행의 매니저 번호가 동일한 값을 찾는 방식으로 전개합니다. 이는 순방향입니다. 이때 시작점은 Start with mgr is null로 표현합니다. 왜냐하면 최상위 매니저 번호에서 아래 쪽으로 찾아 나가기 때문입니다.여기서 사원번호는 부모 칼럼이고 매니저 번호는 자식 칼럼입니다. 사원번호(부모 칼럼)는 주식별자(PK) 이고 매니저번호(자식 칼럼)는 외래참조키(FK) 죠. Emp 테이블은 자기 참조 관계를 가진 엔터티입니다. 자기 스스로 부모 자식 관계를 가진 엔터티인거죠. Prior 부모 = 자식 이라는 말은 엄밀하게 말하자면 Prior 부모 칼럼 = 자식 칼럼입니다. 풀어서 말하자면 이전 행의 부모 칼럼과 현재 행의 자식 칼럼이 일치하는 경우이죠.만약 Prior mgr = empno (Prior 자식 = 부모)와 같이 찾아갈 경우 역방향 전개입니다. 이때 시작점은 특정 지점(ex.start with ename = 'SMITH')을 선택합니다. 왜냐하면 특정 행에서 부터 상위로 찾아나가는 방식으로 이전 행의 매니저 번호와 현재 행의 사원번호가 동일한 값을 기준으로 찾기 때문입니다.순방향 역방향은 단순히 Prior 키워드로 판단하기는 어렵습니다. Start with 구문의 시작점을 보고 함께 판단해야 합니다. 또한 Prior 키워드는 이전 행을 의미한다는 점, 그리고 계층형 쿼리에서 사용하는 부모 자식이란 자기 참조 관계에 있는 엔터티의 부모 칼럼과 자식 칼럼을 의미한다는 점을 기억하고 순방향 역방향읗 판단해야 합니다. 노랭이 문제집의 63번 문제 보기 4번은 2군데가 잘못되어 있습니다. 보기 4번: ④ 오라클의 계층형 질의문에서 PRIOR 키워드는 CONNECT BY 절에서만 사용될 수 있으며, PRIOR 자식 = 부모 형태로 사용하면 순방향 전개로 수행된다.1) 첫 번째 잘못된 부분은 'Prior 키워드가 Connect By 절에서만' 사용될 수 있다고 한 부분입니다. Prior 키워드는 Select 절에서도 사용될 수 있습니다. 이때 Prior 키워드는 현재 행의 부모(이전) 행의 값을 가져오는 용도로 사용합니다. 노랭이 해설지에는 이 부분에 대한 설명만 제공하고 있습니다. 2) 두 번째 잘못된 부분은 'Prior 자식 = 부모 형태로 사용하면 순방향 전개로 수행된다' 라고 한 것입니다. 순방향은 Prior 부모 = 자식입니다. 이전 행의 부모 칼럼을 기준으로 자식을 찾아나가기 때문에 순방향입니다. 역방향은 Prior 자식 = 부모입니다. 이전 행의 자식 칼럼을 기준으로 부모를 찾아나가기 때문에 역방향입니다. (노랭이에서는 Prior 키워드만 가지고 순방향, 역방향을 알기가 어렵기 때문에 위 1)번만 설명한게 아닌가 짐작을 해봅니다.. )참고로.. 위 1번과 2번을 확인할 수 있는 쿼리를 아래에 작성해두었습니다.-- 순방향 전개 SELECT LEVEL,LPAD(' ', (LEVEL-1)*4) || ENAME AS "직원명",EMPNO,MGR,-- (1) 현재 행의 상사(부모)의 ENAME 값을 가져옵니다.PRIOR ENAME AS "직속_상사명"FROMEMP START WITH MGR IS NULL -- 최상위(루트)는 MGR이 NULL인 KINGCONNECT BY PRIOR EMPNO = MGR; -- 순방향 전개 (부모 칼럼 EMPNO = 자식 칼럼 MGR); - 수행 결과 (사진)-- 역방향 전개 SELECT LEVEL,LPAD(' ', (LEVEL-1)*3) || ENAME AS 조직도,EMPNO,MGRFROM EMP START WITH ENAME = 'SMITH' -- SMITH를 최하위 노드로 지정 (LEVEL 1)CONNECT BY PRIOR MGR = EMPNO -- 역방향 전개 (자식 칼럼 MGR = 부모 칼럼 EMPNO). 자식 칼럼(MGR)을 기준으로 부모 칼럼(EMPNO)를 찾으며 위로 전개 (역방향)ORDER SIBLINGS BY EMPNO;- 수행 결과 (사진)emp 테이블 데이터는 아래 링크에서 확인하시면 되겠습니다.https://java7.tistory.com/164
- 1
- 2
- 24
Q&A
Part 2 > Chapter 3 단원 정리 문제
안녕하세요. Part2 Chapter 3의 문제중에, 2번 같은 경우는 충분히 이견을 제시할 수 있을 것 같네요. 좀 애매한 면이 있어서요. 실제 시험에서도 이런 경우가 발생하는 데요. 이의를 제기할 경우 모두 정답으로 처리하는 경우가 있습니다. 참고하시구요. 문제는 좀더 명확히 변경을 해두었습니다. 4, 5번은 실수가 있었습니다. 이것 또한 수정하여 반영해두었습니다. 감사드립니다.
- 0
- 2
- 36
Q&A
챕터1. SQL 기본 단원정리문제 53번
안녕하세요. 쿠라와님. 교안 내용을 알려주셔서 감사합니다. 아래 링크에 이메일을 하나 남겨주세요. 작은 선물을 보내드리겠습니다. https://forms.gle/rXRi6TpFTUxd7sW46감사합니다.
- 0
- 3
- 34
Q&A
챕터1. SQL 기본 단원정리문제 53번
안녕하세요. 데이터코드랩입니다. 말씀하신 내용이 맞습니다. 해당 문제는 이미 정정해서 교안을 갱신해 둔 상태에요. 아마도 다운로드 받으신 파일이 수정 전의 것 같습니다. 새로 다운 받으시면 정정된 것을 사용하실 수 있습니다. 시험 합격 응원할게요 감사합니다.
- 0
- 3
- 34
Q&A
챕터1. SQL 기본 단원정리문제 23번, 50번
안녕하세요. 데이터코드랩입니다. 네 말씀하신 내용이 맞습니다. 오류가 있었어요. 그런데, 이미 수정해서 올려 놓았던 내용인데요. 아마도 교안이 수정하기 전 파일로 보입니다. 새로 받으시면 정정 된 내용을 보실 수 있습니다. 시험이 얼마 안 남았네요 응원하겠습니다 감사합니다.
- 0
- 2
- 31
Q&A
챕터1. SQL 기본 단원정리문제 23번
안녕하세요. 데이터코드랩입니다. 네 말씀하신 내용이 맞습니다. 해당 문제는 얼마전에 정정해서 다시 올려두었는 데요. 아마도 다운로드 받으신 교안이 과거 버전인 듯 합니다. 다시 다운로드 받으시면 정정된 교안을 사용하실 수 있습니다. 감사합니다.
- 0
- 2
- 31