요약 : 데이터 분석의 신뢰성을 높이기 위해 양질의 데이터를 판단하려면 데이터 오류,결측지,가공 정도를 분석해야 하며, 원천 데이터와 가공 데이터의 균형을 고려해야 한다.
주요 포인트 :
인사이트 :
핵심 개념 :
USED_GOODS_BOARD
테이블과 USED_GOODS_FILE
테이블에서 조회수가 가장 높은 게시글의 첨부파일 경로 조회/home/grep/src/
BOARD_ID
를 기준으로 디렉토리를 구분하고, 파일 이름은 FILE_ID + FILE_NAME + FILE_EXT
로 구성FILE_ID
를 기준으로 내림차순 정렬SELECT CONCAT('/home/grep/src/', B.BOARD_ID, '/', F.FILE_ID, F.FILE_NAME, F.FILE_EXT) FILE_PATH
FROM USED_GOODS_BOARD B
LEFT JOIN USED_GOODS_FILE F ON B.BOARD_ID = F.BOARD_ID
WHERE B.VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)
ORDER BY F.FILE_ID DESC;
USED_GOODS_BOARD
에서 가장 조회수가 높은 게시글(MAX(VIEWS)
)을 조회USED_GOODS_FILE
과 BOARD_ID
기준으로 LEFT JOIN
CONCAT
을 사용해 파일 경로를 생성 (/home/grep/src/BOARD_ID/FILE_IDFILE_NAME.FILE_EXT
)FILE_ID
를 기준으로 내림차순 정렬FIRST_HALF
테이블(상반기 주문량)과 JULY
테이블(7월 주문량)의 SHIPMENT_ID
를 기준으로 주문량 합산SELECT H.FLAVOR
FROM FIRST_HALF H
LEFT JOIN (SELECT FLAVOR, SUM(TOTAL_ORDER) TOTAL_ORDER, SHIPMENT_ID
FROM JULY
GROUP BY FLAVOR) J
ON H.SHIPMENT_ID = J.SHIPMENT_ID
ORDER BY H.TOTAL_ORDER + J.TOTAL_ORDER DESC
LIMIT 3;
JULY
테이블에서 FLAVOR
기준으로 SUM(TOTAL_ORDER)
를 구해 서브쿼리 생성FIRST_HALF
테이블과 SHIPMENT_ID
기준으로 LEFT JOIN
ORDER BY
를 사용해 총 주문량(H.TOTAL_ORDER + J.TOTAL_ORDER
)이 많은 순으로 정렬LIMIT 3
)BOOK
, AUTHOR
, BOOK_SALES
테이블에서 2022년 1월 판매 데이터를 기준으로 매출액 집계TOTAL_SALES = 판매량 * 가격
AUTHOR_ID
), 카테고리(CATEGORY
), 매출액(TOTAL_SALES
) 조회AUTHOR_ID
오름차순, 같은 경우 CATEGORY
내림차순 정렬SELECT B.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(B.PRICE * S.SALES) TOTAL_SALES
FROM BOOK B
LEFT JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
LEFT JOIN BOOK_SALES S ON B.BOOK_ID = S.BOOK_ID
WHERE S.SALES_DATE LIKE '2022-01%'
GROUP BY 1,2,3
ORDER BY B.AUTHOR_ID, B.CATEGORY DESC;
BOOK
과 AUTHOR
를 AUTHOR_ID
기준으로 LEFT JOIN
BOOK
과 BOOK_SALES
를 BOOK_ID
기준으로 LEFT JOIN
SALES_DATE
가 2022-01%
(2022년 1월)인 데이터만 조회SUM(B.PRICE * S.SALES)
로 매출액 계산AUTHOR_ID
기준 오름차순, CATEGORY
기준 내림차순 정렬CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블에서 2022년 8월~10월 기간 동안 대여 시작일(START_DATE
)을 기준으로 대여 횟수 집계MONTH
) 대여 횟수(RECORDS
) 조회MONTH
오름차순, 같은 경우 CAR_ID
내림차순 정렬SELECT DATE_FORMAT(START_DATE, '%m') MONTH, CAR_ID, COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
AND CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
)
GROUP BY MONTH, CAR_ID
ORDER BY MONTH, CAR_ID DESC;
START_DATE
가 2022년 8월~10월 사이인 데이터를 필터링CAR_ID
별 COUNT(*)
를 구해 5회 이상인 CAR_ID
만 조회GROUP BY MONTH, CAR_ID
를 사용해 월별, 자동차별 대여 횟수 집계MONTH
오름차순, CAR_ID
내림차순 정렬MEMBER_PROFILE
과 REST_REVIEW
테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰 조회MEMBER_NAME
), 리뷰 텍스트(REVIEW_TEXT
), 리뷰 작성일(REVIEW_DATE
) 조회REVIEW_TEXT
오름차순 정렬SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') REVIEW_DATE
FROM MEMBER_PROFILE M
LEFT JOIN REST_REVIEW R ON M.MEMBER_ID = R.MEMBER_ID
WHERE M.MEMBER_ID = (
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(*) DESC
LIMIT 1
)
ORDER BY 3,2;
REST_REVIEW
에서 MEMBER_ID
를 기준으로 리뷰 개수를 집계해 가장 많이 작성한 회원을 서브쿼리로 추출MEMBER_PROFILE
과 REST_REVIEW
를 MEMBER_ID
기준으로 LEFT JOIN
REVIEW_DATE
) 오름차순 정렬, 같은 경우 REVIEW_TEXT
오름차순 정렬GROUP BY
와 함께 사용할 수 없음.GROUP BY
는 그룹별 집계 결과를 반환하는 반면, 윈도우 함수는 각 행별로 결과를 반환하기 때문.ROW_NUMBER()
는 기본적으로 순위를 랜덤으로 지정하지만, 특정한 경우 명확한 순위를 지정해야 할 필요가 있음.LAG()
함수LAG()
는 이전 행의 값을 조회할 때 사용됨.SELECT user_id, sales_date, sales_amount,
LAG(sales_amount, 1, 0) OVER (PARTITION BY user_id ORDER BY sales_date) AS previous_sales
FROM online_sales;
LAG(sales_amount, 1, 0)
: 한 행 전의 sales_amount
값을 가져오고, 없으면 0
을 반환.WITH RECURSIVE HOURS AS
부분에서 SELECT 0 AS HOUR
는 재귀 CTE에서 초기 값을 설정하는 역할을 함.WITH RECURSIVE HOURS AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1 FROM HOURS WHERE HOUR < 23
)
SELECT 0 AS HOUR
: 재귀의 시작값 (초기값)UNION ALL
을 통해 0부터 23까지 숫자를 생성함.NOT IN
을 사용할 경우, 서브쿼리에 NULL
이 존재하면 결과를 반환하지 않는 문제가 발생함.NOT EXISTS
를 사용하여 해당 기간 동안 대여된 자동차가 없는 경우만 선택하도록 변경.SELECT *
FROM CAR_RENTAL_COMPANY_CAR C
WHERE NOT EXISTS (
SELECT 1 FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
WHERE C.CAR_ID = H.CAR_ID
AND H.START_DATE <= '2022-11-30'
AND H.END_DATE >= '2022-11-01'
);
SELECT 1
은 존재 여부만 확인하므로 성능 면에서도 NOT IN
보다 유리함.