728x90
이 포스팅은 <SQL로 맛보는 데이터 전처리 분석(https://www.yes24.com/Product/Goods/86544423)> 책의 5장을 학습하며 정리한 내용이다.

상품리뷰 데이터 분석 - 2
이전 포스팅에서는 Division 별 평점 분포, 평점 낮은 순서로 조회 등을 알아봤다.
이번 포스팅에서는 가장 낮은 평점을 Department별, 연령별로 다양하게 조회해본다.
데이터세트 컬럼 구조
| Clothing ID | 상품번호(Unique Value) |
| Age | 리뷰 작성자의 연령 |
| Title | 리뷰 제목 |
| Review Text | 리뷰 내용 |
| Rating | 사용자가 제출한 평점 |
| Recommend IND | 상품 추천 여부 |
| Positive Feedback Count | 긍정적 피드백 수 |
| Division Name | 상품이 속한 Division (Initmates, General ...) |
| Department Name | 상품이 속한 Department(Bottoms , jackets...) |
| Class Name | 상품의 타입 |
연령별 Worst Department
- Department 별, 연령대별 가장 낮은 점수 조회
SELECT
`department name`
, FLOOR(AGE/10) * 10 AGEBAND -- 연령별
, AVG(RATING) AS AVG_RATING -- 평균 평점
FROM dataset2
GROUP BY 1, 2 -- 연령별, 평균 평점으로 그룹핑
HAVING AGEBAND = 10 -- HAVING: AGEBAND가 10인 그룹만 선택
ORDER BY 3 ASC
;

- Department 별, 연령별 평균 평점과 순위
-- 윈도우 함수 ROW_NUMBER()를 사용하여 데이터를 순위를 매김
SELECT *
, ROW_NUMBER() OVER(PARTITION BY AGEBAND ORDER BY AVG_RATING) RNK -- 연령대(AGEBAND)별로 순위를 계산
FROM (
SELECT
`department name`
, FLOOR(AGE/10) * 10 AGEBAND
, AVG(RATING) AS AVG_RATING
FROM dataset2
GROUP BY 1, 2
) A -- subquery Alias
;

- 연령별로 가장 낮은 평점을 준 Department 조회
위의 쿼리를 서브쿼리로 삽입하고, 메인쿼리에 RNK = 1이라는 조건을 준다.
SELECT *
FROM (
SELECT *
, ROW_NUMBER() OVER(PARTITION BY AGEBAND ORDER BY AVG_RATING) RNK
FROM (
SELECT
`department name`
, FLOOR(AGE/10) * 10 AGEBAND
, AVG(RATING) AS AVG_RATING
FROM dataset2
GROUP BY 1, 2
) A
) A
WHERE RNK = 1;

728x90
'DataBase > SQL' 카테고리의 다른 글
| [SQL] 상품리뷰 데이터 분석 3. 텍스트 분석 (0) | 2023.10.10 |
|---|---|
| [SQL] 상품리뷰 데이터 분석 - 1 with MySQL (0) | 2023.10.06 |
| [SQL] 기초문법 - CREATE, INSERT, DELETE, UPDATE, VIEW (0) | 2023.10.06 |
| MySQL - Unhandled exception : 'ascii' codec can't decode byte 0xc3 in position 480: 해결방법 (2) | 2023.10.04 |
| [SQLD] 1과목 - 데이터 모델링의 이해 1. 개념정리 (0) | 2023.09.21 |