๐ป ๋ฌธ์ ์ฃผ์ : https://leetcode.com/problems/immediate-food-delivery-ii/
Immediate Food Delivery II - LeetCode
Can you solve this real interview question? Immediate Food Delivery II - Table: Delivery +-----------------------------+---------+ | Column Name | Type | +-----------------------------+---------+ | delivery_id | int | | customer_id | int | | order_date | d
leetcode.com
๐ป ๋ฌธ์
If the customer's preferred delivery date is the same as the order date, then the order is called immediate; otherwise, it is called scheduled. The first order of a customer is the order with the earliest order date that the customer made. IT is guaranteed that a customer has precisely one first order. Write a solution to find the percentage of immediate orders in the first orders of all customers, rounded to 2 decimal places.


๐ป ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-- 1) ์๋ธ์ฟผ๋ฆฌ๋ง ์ด์ฉ
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)
-- 2) ์๋ธ์ฟผ๋ฆฌ ๋ฐ ์กฐ์ธ ์ด์ฉ
select round(avg(order_date = customer_pref_delivery_date)*100, 2) AS immediate_percentage
from Delivery
join
(select customer_id, MIN(order_date) AS order_date
from Delivery
group by customer_id) a
using
(customer_id, order_date);
๐ป ๋ฌธ์ ํ์ด
์ ๋ฌธ์ ๋ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ํ๋ค.
1๏ธโฃ ๊ฐ customer_id๋ณ๋ก first_order ๊ตฌํ๊ธฐ
2๏ธโฃ ์ ์ฒด First_order ์ค Order_date = customer_pref_delivery_date (*immediate)๊ฐ ์ฐจ์งํ๋ ๋น์จ ๊ตฌํ๊ธฐ
3๏ธโฃ (2)์์ ๊ตฌํ ๋น์จ์ ์์ซ์ ๋ ์๋ฆฌ๊น์ง ๋ํ๋ด๊ธฐ
1๏ธโฃ ๊ฐ Customer_id๋ณ๋ก first_order ๊ตฌํ๊ธฐ
์ Input ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉด Id๊ฐ 1์ธ ๊ณ ๊ฐ์ order_date๊ฐ ๊ฐ๊ฐ 2019-08-01, 2019-08-11๋ก, ์ด ๋ ๋ฒ ๊ตฌ๋งคํ๋ค. 1๋ฟ๋ง ์๋๋ผ 2, 3๋ ๋ ๋ฒ์ฉ ๊ตฌ๋งคํ๋๋ฐ ์ฐ๋ฆฌ๋ ์ด์ค ์ ์ผ ์ฒ์ ๊ตฌ๋งคํ ๋ ์ง๋ฅผ first_order์ด๋ผ ์ ์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ ๊ณ ๊ฐ๋ณ๋ก ๊ตฌ๋งค ๋ฐ์ดํฐ ํ๋์ฉ์ ๋จ๊ธฐ๊ณ ๋๋จธ์ง๋ ์ ์ธํด์ผ ํ๋ค.
SELECT customer_id, MIN(order_date)
FROM Delivery
GROUP BY customer_id
๋ค๋ง group by๋ก ๋ฌถ์ ๊ฒฝ์ฐ, ์กฐ๊ฑด์ผ๋ก ์ ์ํ ๋ฐ์ดํฐ์ ์ฒซ ํ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ด๊ธฐ ๋๋ฌธ์ id๊ฐ 3์ธ ๊ณ ๊ฐ์ first_order์ 2019-08-21์ด ์๋ 2019-08-24๋ก ๋ฌถ์ด๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ต์ order_date๋ฅผ ๊ตฌํ๊ธฐ ์ํด min() ํจ์๋ฅผ ์จ์ค์ผ ํ๋ค.
2๏ธโฃ ์ ์ฒด First_order ์ค order_date = customer_pref_delivery_date (*immediate)๊ฐ ์ฐจ์งํ๋ ๋น์จ ๊ตฌํ๊ธฐ
Immediate๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ customer_pref_delivery_date ๋ฐ์ดํฐ๊ฐ ํ์ํ๋, ์ ์ฝ๋ ๋ด select ํ์ customer_pref_delivery_date๋ฅผ ๋ฃ์ผ๋ฉด min(order_date)์ ๋งค์นญ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์๊น๋ ๋งํ์ง๋ง group by๋ก ๋ฌถ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ์ฒซ ๋ฒ์งธ ํ์ ์๋ ๋ฐ์ดํฐ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, id๊ฐ 3์ธ ๊ณ ๊ฐ์ order_date๊ฐ 2019-08-21์ธ ๋ฐ๋ฉด customer~_date๋ 2019-08-24๋ก ๋์ฌ ์๊ฐ ์๋ค.
๋ฐ๋ผ์ ์ ์ฝ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ฃ์ด (customer_id, order_date)๊ฐ first_order์ ์ถฉ์กฑํ๋ ๊ฐ๋ค๋ง ๊ณจ๋ผ๋ด์ผ ํ๋ค.
select
from Delivery
where (customer_id, order_date) -- first_order์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง ์ถ์ถ
in (select customer_id, min(order_date) from Delivery group by customer_id)
์ด์ ๋จ์ ๊ฒ์ ๊ฐ๋จํ๋ค. ์ ์ฒด ๋ฐ์ดํฐ ์ค immediate๊ฐ ํด๋นํ๋ ๋น์จ์ด๋ผ๋ ๊ฒ์, ์ ์ฒด ์ค order_date์ customer~_date๊ฐ ๋์ผํ ๋ฐ์ดํฐ์ ํ๊ท ์ ๊ตฌํ๋ผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
select round(avg(order_date = customer_pref_delivery_date)*100, 2) as immediate_percentage
from Delivery
where (customer_id, order_date) -- first_order์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง ์ถ์ถ
in (select customer_id, min(order_date) from Delivery group by customer_id)
3๏ธโฃ (2)์์ ๊ตฌํ ๋น์จ์ ์์ซ์ ๋ ์๋ฆฌ๊น์ง ๋ํ๋ด๊ธฐ
avg() ํจ์๋ฅผ ํตํด immediate์ ํ๊ท ์ ๊ตฌํ๋ฉด ์์ซ์ ์ด ๋์ค๋ ์ด๋ฅผ 100์ ๊ณฑํจ์ผ๋ก์จ % ๊ฐ์ผ๋ก ๋ณํํด์ค๋ค. ์ดํ round() ํจ์๋ฅผ ํตํด ์์ซ์ ๋ ์๋ฆฌ ์๊น์ง ์ถ๋ ฅ๋๊ฒ ์ค์ ํ ํ ๋ฌธ์ ์์ ์๊ตฌํ immediate_percentage๋ก ์ด๋ฆ์ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
๐ป Beats์ ๋ฌธ์ ์
์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด Beats๋ 5.1%๋ก, ์ ๋ต์ด๊ธด ํ๋ ๊ทธ๋ค์ง ์ํ์ ์์ด์ ์ข์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ธ๋ค. ๊ทธ ์ด์ ๋ ๋ฐ๋ก '์๋ธ์ฟผ๋ฆฌ'๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ.
๋ณธ ๋ฌธ์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํ์๋ถ๊ฐ๊ฒฐํ๊ธด ํ๋, ํ ๋ฒ order_date๊ฐ customer_pref์ ๋ง๋์ง๋ฅผ ๋น๊ตํ๊ธฐ ์ํด ๊ณ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋๋ ค์ผ ํ๋ ๋ณต์ก๋ ๋ถ๋ถ์์ ์ํ๋ ฅ์ด ๋ค์ ๋จ์ด์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.
* ๋ง์ฝ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ ์ฟผ๋ฆฌ๊ฐ ์๋ค๋ฉด ํธํ ๋ง์ ๋ถํ๋๋ ค์๐ฅฐ!
์ด๋ด ๋ JOIN์ ํตํด ํ ๋ฒ์ first_order์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ก๋ง ๊ตฌ์ฑ๋ ํ ์ด๋ธ์ ๋ง๋ ํ, ์ฌ๊ธฐ์์๋ง immediate์ ํด๋นํ๋ ๋ฐ์ดํฐ๊ฐ ๋์ฌ ์ ์๊ฒ ์ฝ๊ฐ์ ์กฐ์ ๋ง ํด์ฃผ๋ฉด ๋๋ค.
select round(avg(order_date = customer_pref_delivery_date)*100, 2) AS immediate_percentage
from Delivery
join
(select customer_id, MIN(order_date) AS order_date
from Delivery
group by customer_id) a
using
(customer_id, order_date);
'SQL > LeetCode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode][SQL50] #23. Number of Unique Subjects Taught by Each Teacher (1) | 2024.01.03 |
---|---|
[LeetCode][SQL50] #22. Game Play Analysis IV (0) | 2024.01.02 |
[LeetCode][SQL50] #20. Monthly Transactions I (0) | 2023.11.16 |
[LeetCode][SQL50] #19. Queries Quality and Percentage (0) | 2023.11.15 |
[LeetCode][SQL50] #18. Percentage of Users Attended a Contest (0) | 2023.11.15 |