본문 바로가기
내일배움 과제/기타 과제

걷기반 SQL - 7) 랭크게임 하다가 싸워서 피드백 남겼어요…

by GREEN나무 2024. 10. 18.
728x90

25. lol_feedbacks 테이블에서 만족도 점수(satisfaction_score)에 따라 피드백을 내림차순으로 정렬하는 쿼리를 작성해주세요!

SELECT * FROM lol_feedback ORDER BY satisfaction_score DECS;

26. lol_feedbacks 테이블에서 각 유저별로 최신 피드백을 찾는 쿼리를 작성해주세요!

WITH feedbacks_date AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY feedback_date DESC) AS rn
FROM lol_feedbacks
)SELECT *
FROM feedbacks_date
WHERE rn = 1;

27. lol_feedbacks 테이블에서 만족도 점수가 5점인 피드백의 수를 계산하는 쿼리를 작성해주세요!

SELECT COUNT(*) AS feedback_count FROM lol_feedbacks WHERE satisfaction_score = 5;

28. lol_feedbacks 테이블에서 가장 많은 피드백을 남긴 상위 3명의 고객을 찾는 쿼리를 작성해주세요!

SELECT name, COUNT(*) AS feedback_count FROM lol_feedbacks
GROUP BY name ORDER BY feedback_count DESC LIMIT 3;

 

29. lol_feedbacks 테이블에서 평균 만족도 점수가 가장 높은 날짜를 찾는 쿼리를 작성해주세요!

SELECT feedback_date, AVG(satisfaction_score) AS avg_score
FROM lol_feedbacks
GROUP BY feedback_date
ORDER BY avg_score DESC
LIMIT 1;

 


풀이

26

1) 서브쿼리 방식

먼저, 각 유저의 최신 피드백을 구하기 위해 lol_feedbacks 테이블에서 name 별로 가장 최근 날짜의 피드백을 찾습니다. 서브쿼리 안에서 각 유저별로 MAX(feedback_date)를 계산하고, 메인 쿼리에서 이 값과 일치하는 피드백을 가져옵니다.

SELECT *
FROM lol_feedbacks AS f1
WHERE f1.feedback_date = (
SELECT MAX(f2.feedback_date)
FROM lol_feedbacks AS f2
WHERE f1.name = f2.name
);

 

설명:

lol_feedbacks 테이블의 name를 기준으로 각 유저의 최신 피드백을 찾는 구조입니다.

서브쿼리(SELECT MAX(f2.feedback_date) ...)는 각 유저의 name에 대해 가장 최신의 feedback_date를 찾습니다.

메인 쿼리에서는 lol_feedbacks 테이블에서 이 최신 날짜와 일치하는 피드백을 출력합니다.

 

2) 윈도우 함수 방식

ROW_NUMBER()

각 유저별로 피드백을 날짜별로 순서화하고, 그중 첫 번째 피드백을 가져오는 방식입니다.

WITH feedbacks_date AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY feedback_date DESC) AS rn
FROM lol_feedbacks
)SELECT *
FROM feedbacks_date
WHERE rn = 1;

 

설명:

WITH 절을 사용해 feedbacks_date라는 임시 테이블을 생성합니다. 이 테이블은 각 유저의 피드백을 날짜별로 순서를 매긴 결과입니다.

ROW_NUMBER() 함수는 각 name 그룹 내에서 feedback_date를 내림차순으로 정렬해 순번을 부여합니다. 가장 최신 피드백은 순번이 1이 됩니다.

마지막 SELECT 문에서는 rn = 1 조건을 걸어 각 유저의 최신 피드백만 가져옵니다.

 

 

출처

 

26: https://m.blog.naver.com/regenesis90/222184066546, https://schatz37.tistory.com/46