๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
SQL/LeetCode

[LeetCode][SQL50] #21. Immediate Food Delivery II

by ์ด๋ฎด 2024. 1. 1.
728x90

๐Ÿ’ป ๋ฌธ์ œ

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.

Input : Delivery table ์˜ˆ์‹œ
Output ์˜ˆ์‹œ

 

๐Ÿ’ป ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

๋”๋ณด๊ธฐ
-- 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);

Beats 95.18%๋กœ ์ƒํ–ฅ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค

728x90
๋ฐ˜์‘ํ˜•