목록리트코드 (17)
오랑우탄의 반란
오늘도 오랑이는 문제를 풉니다. 1164. Product Price at a Given Date 풀이 과정CTE 를 사용해서 푸는 연습을 해봅니다. 우선 change_date 가 '2019-08-16' 보다 작거나 같은 경우에 대한 조건을 지정해줘야 합니다. 예전 프로그래머스 자동차 대여 문제와 동일한 방식으로 8월 16일에 대해서 1, 아니면 0으로 값을 지정해주고 sum 으로 묶어서 푸는 방식인줄 알았지만, 해당 경우는 8월 16일이 존재하는지 여부가 중요한 것인 반면, 이번 문제는 8월 16일까지의 가장 최신 값과 그 이후에 대한 값은 또 다르게 지정하는 경우여서 각각 분리해서 풀어야 했습니다. change_date 각 product_id별로 change_date 가 최신값인 행을 구해야 하는 ..
오늘도 오랑이는 문제를 풉니다. 180. Consecutive Numbers 풀이 과정처음에는 문제에서 요구한 조건을 말그대로 생각해서 having count() 를 사용해 풀고자 했는데 이것은 틀린 풀이입니다.이유는 l2.num - l1.num = 0 은 숫자를 출력하는 것이 아닌 boolean 값 즉 True/False 를 출력하는 것이기 때문에 적합하지 않기 때문입니다. having count(l2.num - l1.num = 0) >= 3 대신 아주 간단하게 self join 과 where 조건절을 활용해서 아래와 같이 풀 수 있습니다. 최종 코드select distinct l1.num as ConsecutiveNumsfrom logs l1 join logs l2 on l2.id - l1.id ..
오늘도 오랑이는 문제를 풉니다. 1045. Customers Who Bought All Products 풀이 과정Customer 테이블에서 customer_id 기준으로 정렬했을 때의 product_key 와 Product 테이블의 product_key 가 일치한 경우 customer_id 를 출력하는 쿼리가 필요합니다. 이때 Product 테이블의 값은 모두 distinct 한 값이란 점을 감안하면, customer_id 기준 각 product_key 의 개수와 Product 테이블 값의 개수가 일치한다는 말로 해석할 수 있습니다. 그러면 이제 쿼리는 완료입니다. 우선 customer_id 기준으로 group 하고 count 에 대한 조건을 having 절 안에 넣어줍니다.이때 Customer ..
오늘도 오랑이는 문제를 풉니다. 550. Game Play Analysis IV 풀이 과정우선 날짜 조건을 지정해줍니다. 이전에 봤던 SELF JOIN 을 활용한 문제와 비슷하게 DATEDIFF(날짜1, 날짜2) = 1 AND 날짜2 > 날짜1 조건으로 풀려고 했는데 이보다 더 간단한 시간/날짜 계산 함수가 있었습니다. DATE_ADD & DATE_SUB 시간/날짜 계산 함수사용 방법은 간단합니다. 기준 날짜와 계산 단위를 인수로 받아서 작동합니다. DATE_ADDDATE_ADD(기준날짜, INTERVAL 기간)#예시DATE_ADD(NOW(), INTERVAL 3 DAY)--> 현재 날짜 + 3일 DATE_SUBDATE_SUB(기준날짜, INTERVAL 기간)#예시DATE_SUB(NOW(), INT..
오늘도 오랑이는 문제를 풉니다. 1174. Immediate Food Delivery II 풀이 과정우선 first order에 대한 조건을 정리해줍니다.where (delivery_id, order_date) in (select delivery_id, min(order_date) from delivery group by 1) 그리고 이에 대한 count 를 구해줍니다.avg 함수를 쓰면 우리가 원하는 결과를 sum / 없이 간단하게 구할 수 있습니다. 이때 avg 안에 if __ 1, 0 으로 함수를 넣었는데 따로 숫자를 지정해주지 않아도 알아서 일치하는 값 (True) 에 대해서 1, 불일치 값 (False) 에 대해서 0을 출력해서 평균이 구해집니다. select avg(customer_pref_..
오늘도 오랑이는 문제를 풉니다. 1193. Monthly Transactions I 풀이 과정우선 간단한 조건부터 정리해서 써줍니다.select date_format(trans_date ,'%Y-%m') as month, country, count(id) as trans_count, /*QUERY*/ as approved_count, sum(amount) as trans_total_amount, /*QUERY*/ as approved_total_amountfrom transactionsgroup by 1, 2 ; approved_count 와 approved_total_amount 는 각각 state = 'approved' 라는 조건이 필요한데, ..
오늘도 오랑이는 문제를 풉니다. 1251. Average Selling Price 풀이 과정문제를 제대로 읽고 파악합시다. 처음 작성한 코드는 아래와 같았는데 틀렸습니다. 왜 그런가 단계별로 쿼리를 돌려보며 살펴봤는데 JOIN 했을 때 모든 테이블을 뽑아보니 product_id 별로 값이 중복으로 출력되는 것을 봤습니다. 즉, 제대로 JOIN 이 안 되었다는 걸 알 수 있지요. SELECT p.product_id, round(sum(units*price)/sum(units),2) as average_priceFROM prices p JOIN unitssold u ON p.product_id = u.product_id GROUP BY p.product_id 문제를 다시 살펴봅니다. 1. 조건 이슈ave..
오늘도 오랑이는 문제를 풉니다. 1934. Confirmation Rate 조인을 활용해서 쉽게 풀 수 있는 문제입니다. SELECT s.user_id , round(ifnull(c2.confirm / c1.total,0),2) AS confirmation_rateFROM signups s left join (select user_id, count(*) as total from confirmations group by 1) c1 on s.user_id = c1.user_id left join (select user_id, count(*) as confirm from confirmations where action = 'confirmed' group by 1) c2 ..