목록LeetCode (15)
오랑우탄의 반란
오늘도 오랑이는 문제를 풉니다. 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 ..
테이블을 자기 자신과 조인하는 셀프 조인에 대해 알아보겠습니다. SELF JOIN은 한 테이블 내에서 칼럼 간, 개별 값 간 대조가 필요할 때 사용할 수 있습니다. 문법은 JOIN/쉼표로 연결하고 (필수) 별칭을 붙여줍니다.SELECT column_name(s)FROM table1 T1, table1 T2WHERE condition; 아래 두 가지 예시로 SELF JOIN의 활용을 살펴보겠습니다. LeetCode | 197. Rising Temperaturehttps://leetcode.com/problems/rising-temperature/ 하나의 테이블 내의 날짜 값과 온도 값에 대한 비교가 필요하기 때문에 self join 을 사용해서 이어줍니다. from weather w1 join we..