
네.. 오랜만이죠? 마음 다 잡고 다시 한 번 시작해볼게요 !!
오랜만에 하려니 'group by'가 생각이 안나더라고요 ㅋㅋㅋㅋ,,
그런데 해결은 아직 못했습니다.
하루에 한 시간 코테에 투자해볼게요 😀
WITH T AS (
SELECT customer_id
, MIN(order_date) min
, customer_pref_delivery_date pref
FROM Delivery
GROUP BY customer_id
)
SELECT ROUND(100 * (COUNT(*) / (SELECT COUNT(DISTINCT customer_id) FROM Delivery)), 2) AS immediate_percentage
FROM Delivery
WHERE (customer_id, order_date) IN (SELECT customer_id, min FROM T WHERE min = pref)
여기까지 했습니당
소수점 2번째 자리까지 반올림 하라면서.. 답이 50, 37.5 이런 식이던데요 리트코드 ?

제 코드에서 with문으로 만든 서브쿼리에서 MIN(order_date)에 해당하는 customer_pref_delivery_date가 출력되는지 확인해보았더니
그렇지가 않더라고요..? 그래서 이게 리트코드 오류인건지 제가 틀린 건지 잘 모르겠네요 .. 🥲
다른 사람의 코드를 살펴보았습니다앗
처음 보는 문법??도 있어서 충격...
일단 이해하기 쉬운 코드부터!
SELECT
ROUND(SUM(CASE WHEN order_date = customer_pref_delivery_date THEN 1 ELSE 0 END) * 100.0 / COUNT(DISTINCT customer_id), 2) AS immediate_percentage
FROM Delivery
WHERE (customer_id, order_date) IN (
SELECT customer_id, MIN(order_date) AS first_order_date
FROM Delivery
GROUP BY customer_id
)
case문으로 1를 더하거나 빼거나.. 당신 똑똑해
다음 코드에서는 AVG()안에 쓰인 문법은 처음 접했습니다!!
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
);
주어진 쿼리에서 avg(order_date = customer_pref_delivery_date) 부분은 조건식인 (order_date = customer_pref_delivery_date)의 결과를 평균내는 것입니다.
여기서 (order_date = customer_pref_delivery_date)는 불리언 조건식으로, 각 행에서 order_date와 customer_pref_delivery_date가 동일한지 여부를 나타냅니다. 만약 두 날짜가 동일하다면 이 조건식은 참(True)을 반환하고, 그렇지 않으면 거짓(False)을 반환합니다.
그리고 이 값들의 평균을 계산하면, 전체 행 중에서 이 조건이 참인 비율이 됩니다. 그 비율에 100을 곱해서 백분율로 표시하고, round() 함수를 사용하여 소수점 둘째 자리까지 반올림합니다.
충격 그 자체입니다...! 😮😮😮😮😮😮