[리트코드] |1211. Queries Quality and Percentage; CASE WHEN 비율문제!
https://leetcode.com/problems/queries-quality-and-percentage/
1. Problem
각 쿼리명(query_name)별로 두 가지 지표를 계산해야 한다.
- Quality: (평점 / 노출 순위)의 평균값
- Poor Query Percentage: 평점이 3점 미만인 데이터가 전체에서 차지하는 비율(%) 단순한 집계를 넘어, 특정 조건을 만족하는 데이터의 '비중'을 어떻게 계산할 것인가가 문제의 핵심이다.
2. Solution: AVG(CASE WHEN) 패턴의 마법
조건에 맞는 경우 1, 아니면 0을 부여한 뒤 이 값들의 평균을 내면 곧바로 비율이 된다.
3. Takeaway: 왜 COUNT보다 AVG(CASE WHEN)이 객관적으로 우수한가?
- COUNT의 함정 (유진 님의 오답 분석):
- COUNT(rating < 3)은 괄호 안의 결과가 TRUE(1)이든 FALSE(0)이든 값이 존재하기만 하면 모두 카운트해버린다. 따라서 조건별 개수를 세려면 COUNT(CASE WHEN 조건 THEN 1 END)처럼 ELSE NULL을 활용해야 하는 번거로움이 있다.
- AVG를 활용한 비율 계산의 우아함:
- 특정 조건에 1과 0을 부여하고 평균을 내는 방식은 **(조건 만족 개수 / 전체 개수)**라는 비율의 정의와 정확히 일치한다.
- 코드가 훨씬 간결해지며, 가독성 측면에서도 "이 조건의 비중을 구한다"는 의도가 명확히 전달된다.
- 데이터 정합성: 소수점 처리(ROUND)와 백분율 변환(* 100)의 순서를 명확히 하여 연산 오류를 방지하는 습관이 중요하다.
Table: Queries
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| query_name | varchar |
| result | varchar |
| position | int |
| rating | int |
+-------------+---------+
This table may have duplicate rows.
This table contains information collected from some queries on a database.
The position column has a value from 1 to 500.
The rating column has a value from 1 to 5. Query with rating less than 3 is a poor query.
We define query quality as:
The average of the ratio between query rating and its position.
We also define poor query percentage as:
The percentage of all queries with rating less than 3.
Write a solution to find each query_name, the quality and poor_query_percentage.
Both quality and poor_query_percentage should be rounded to 2 decimal places.
Return the result table in any order.
The result format is in the following example.
Example 1:
Input:
Queries table:
+------------+-------------------+----------+--------+
| query_name | result | position | rating |
+------------+-------------------+----------+--------+
| Dog | Golden Retriever | 1 | 5 |
| Dog | German Shepherd | 2 | 5 |
| Dog | Mule | 200 | 1 |
| Cat | Shirazi | 5 | 2 |
| Cat | Siamese | 3 | 3 |
| Cat | Sphynx | 7 | 4 |
+------------+-------------------+----------+--------+
Output:
+------------+---------+-----------------------+
| query_name | quality | poor_query_percentage |
+------------+---------+-----------------------+
| Dog | 2.50 | 33.33 |
| Cat | 0.66 | 33.33 |
+------------+---------+-----------------------+
Explanation:
Dog queries quality is ((5 / 1) + (5 / 2) + (1 / 200)) / 3 = 2.50
Dog queries poor_ query_percentage is (1 / 3) * 100 = 33.33
Cat queries quality equals ((2 / 5) + (3 / 3) + (4 / 7)) / 3 = 0.66
Cat queries poor_ query_percentage is (1 / 3) * 100 = 33.33
1. 정답 쿼리
SELECT query_name,
ROUND(AVG(rating / position),2) AS quality,
ROUND(AVG(CASE WHEN rating <3 THEN 1 ELSE 0 END)*100,2) AS poor_query_percentage
FROM Queries
GROUP BY query_name;
2. 나의 답안
SELECT query_name,
ROUND(AVG(rating / position),2) AS quality,
COUNT(RATING <3)/COUNT(*)AS poor_query_percentage # 비율문제를 COUNT로 접근하는 하수!!!
FROM QUERIES
GROUP BY query_name