1174. Immediate Food Delivery II(LeetCode)

minllny·2024년 5월 1일


네.. 오랜만이죠? 마음 다 잡고 다시 한 번 시작해볼게요 !!
오랜만에 하려니 '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
);

gpt에게 도움 요청을 해보았습니다

주어진 쿼리에서 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() 함수를 사용하여 소수점 둘째 자리까지 반올림합니다.

충격 그 자체입니다...! 😮😮😮😮😮😮

profile
SQL 끄적끄적

0개의 댓글