홍동이의 성장일기
[LeetCode] 1174. Immediate Food Delivery II (집계함수에 조건 작성하기) 본문
Tool/SQL 코딩테스트 풀이
[LeetCode] 1174. Immediate Food Delivery II (집계함수에 조건 작성하기)
홍동2 2023. 12. 22. 15:23
SELECT ROUND(AVG(order_date = customer_pref_delivery_date)* 100, 2) as immediate_percentage
FROM delivery
WHERE (customer_id, order_date) IN (
SELECT customer_id, MIN(order_date)
FROM delivery
GROUP BY customer_id
)
💡 문제 풀이
1️⃣ customer_id 별로 최초의 order_date를 구해줍니다.
SELECT customer_id, MIN(order_date)
FROM delivery
GROUP BY customer_id
2️⃣ 다중행 서브쿼리를 사용하여 위 조건에 해당하는 행만 추출해줍니다.
WHERE (customer_id, order_date) IN (
SELECT customer_id, MIN(order_date)
FROM delivery
GROUP BY customer_id
)
AVG(order_date = customer_pref_delivery_date)
3️⃣ 마지막으로 immediate 고객의 비율을 구해야합니다.
오늘도 처음보는 풀이를 발견해서 뤼튼에게 자세한 사용법을 물어봤습니다.
💁 쿼리에서 사용된 `AVG` 함수는 조건에 만족하는 레코드들의 개수를 평균내는 것이 아닌, 조건에 만족하는 레코드들의 비율을 계산하는 용도로 사용됩니다. 쿼리에서 `AVG(order_date = customer_pref_delivery_date)`는 `order_date`와 `customer_pref_delivery_date`가 일치하는 경우를 1로, 일치하지 않는 경우를 0으로 표현한 후에, 해당 값들의 평균을 계산하는 것입니다. 따라서 결과는 0과 1 사이의 비율로 표시되며, 해당 비율은 `customer_id`별로 계산되어 첫 번째 행에 반환됩니다.
복잡해질 수 있는 수식을 간단히 해결해주는 좋은 방법인 것 같습니다 😊
해당 기능이 없이 값을 구하려면
WITH cte_type AS (
SELECT *
, CASE
WHEN order_date = customer_pref_delivery_date THEN 1
ELSE 0
END as count_type
FROM delivery
WHERE (customer_id, order_date) IN (
SELECT customer_id, MIN(order_date)
FROM delivery
GROUP BY customer_id
)
)
SELECT ROUND(AVG(count_type) * 100, 2) as immediate_percentage
FROM cte_type
이처럼 CASE 구문을 사용하여 조건에 맞는 행에 '1'이라는 값을 부여하고 이에 대한 평균을 구해주기 위해 cte구문을 사용해주어야하기 때문입니다.
모르는 기능을 하나씩 알아가는 것이 코딩테스트의 묘미인 것 같습니다 😳
728x90
'Tool > SQL 코딩테스트 풀이' 카테고리의 다른 글
[LeetCode] 1204. Last Person to Fit in the Bus (누적합계 구하기) (1) | 2023.12.30 |
---|---|
[LeetCode] 1193. Monthly Transactions I (Date_format 날짜 함수) (0) | 2023.12.24 |
[LeetCode] 1164. Product Price at a Given Date (조건에 따라 다른 값 부여하기) (0) | 2023.12.20 |
[LeetCode] 1158. Market Analysis I (JOIN에 AND 조건 사용하기) (0) | 2023.12.19 |
[LeetCode] 585. Investments in 2016 (0) | 2023.12.13 |
Comments