-
LeetCode) 1211. Queries Quality and Percentage 풀이TIL-sparta 2024. 7. 28. 05:41
학습 키워드: 키워드1, 키워드2, ..., 키워드n
1211. Queries Quality and Percentage
1) 문제 설명 요약 (원문은 링크 참고):
https://leetcode.com/problems/queries-quality-and-percentage/description/
요약: 쿼리의 이름과 결과, position 값과 rating 값을 담은 Queries 테이블에서 쿼리의 quality와 poor_query_percentage를 계산하는 문제다. quality는 쿼리의 rating / position 값의 평균이며, poor_query_quality는 rating 값이 3 미만인 쿼리 수의 비율이다.
조건: query_name은 중복이 가능하며, quality와 poor_query_percentage 값은 소수점 두 자리 까지만 출력한다.
2) 풀이:
오랜만에 풀려고 하니 감이 전혀 안와서 CTE로 범벅을 만들다가 결국 다른 답변을 참고하여 풀게 됐다. 일단 짚고 넘어가야 할 부분은 문제에 명시되어있지 않은 숨은 조건(=문제 오류)인데, query_name 값이 NULL인 row가 존재한다는 점이다. 쿼리의 where 구문에 query_name IS NOT NULL 을 추가해줘야만 정답 처리된다.
구해야하는 quality와 poor_query_percentage 컬럼은 모두 query_name에 기반하는 정보이기 때문에 GROUP BY 구문으로 쿼리 결과를 query_name으로 묶어줘야 한다. 첫 번째 요구사항인 quality의 경우 동일한 query_name을 가진 row들의 rating / position 값의 평균을 구하면 되는데, 이는 AVG 함수를 이용하면 쉽게 구할 수 있다. 두 번째 요구사항인 poor_query_percentage는 CTE로 풀려고 할 때는 COUNT를 이용하려고 해서 살짝 복잡하게 느껴졌던 부분인데, 알고보니 AVG와 IF를 조합하면 쉽게 풀 수 있는 문제였다. 각 row의 rating 값이 3미만인 경우 1, 이상인 경우 0으로 계산하여 평균을 내고 100을 곱해주면 끝이다. 이를 MySQL 쿼리로 표현하면 다음과 같다.
SELECT query_name, ROUND(AVG(rating / position), 2) AS quality, ROUND(AVG(IF(rating < 3, 1, 0)) * 100, 2) AS poor_query_percentage FROM Queries WHERE query_name IS NOT NULL GROUP BY query_name;
3) 기타 사항:
CTE를 익힌 후 부터 모든 쿼리 문제를 무턱대고 CTE로 풀려고 하는 습관이 생겼는데, 단순하게 풀 수 있는 문제를 복잡하게 만드는 경향이 있어서 앞으로는 Group Function만을 이용한 풀이가 가능한지 여부를 우선적으로 판단하도록 해야겠다.
728x90'TIL-sparta' 카테고리의 다른 글
스파르타) The Last Rollback (D-29, Node.js 게임 서버 최종 프로젝트) (0) 2024.07.29 [TIL] TypeScript 배우기 (짧) - 1 (0) 2024.07.28 스파르타) The Last Rollback (D-32, Node.js 게임 서버 최종 프로젝트) (0) 2024.07.26 스파르타) The Last Rollback (D-33, Node.js 게임 서버 최종 프로젝트) (0) 2024.07.25 스파르타) The Last Rollback (D-34, Node.js 게임 서버 최종 프로젝트) - Protobuf (3) (2) 2024.07.25