홍동이의 성장일기
[LeetCode] 1164. Product Price at a Given Date (조건에 따라 다른 값 부여하기) 본문
Tool/SQL 코딩테스트 풀이
[LeetCode] 1164. Product Price at a Given Date (조건에 따라 다른 값 부여하기)
홍동2 2023. 12. 20. 13:35
SELECT product_id
, 10 AS price
FROM products
GROUP BY product_id
HAVING MIN(change_date) > '2019-08-16'
UNION
SELECT product_id
, new_price as price
FROM (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY change_date DESC) as new_date
FROM products
WHERE change_date <= '2019-08-16'
) as t
WHERE new_date = 1
💡 문제 풀이
이번 문제는 각 product_id가 16일에 어떤 값을 가지고 있는지 알아보는 문제입니다.
세단계로 문제를 해결할 수 있습니다!
1단계: 16일과 가장 근접한 날짜의 new_price 찾기
SELECT *
, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY change_date DESC) as new_date
FROM products
WHERE change_date <= '2019-08-16'
change_date가 2019-08-16 이전이거나 같은 행을 불러옵니다.
product_id 별로 change_date를 내림차순하여 순위를 부여하고 new_date라고 이름 붙였습니다.
SELECT product_id
, new_price as price
FROM (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY change_date DESC) as new_date
FROM products
WHERE change_date <= '2019-08-16'
) as t
WHERE new_date = 1
서브쿼리를 이용하여 new_date가 1인 행만 불러와주면 1단계는 끝입니다.
2단계: 16일 이전의 값이 없는 product_id에 10이라는 값주기
SELECT product_id
, 10 AS price
FROM products
GROUP BY product_id
HAVING MIN(change_date) > '2019-08-16'
product_id별로 그룹을 지은 후, change_date의 최솟값이 16일보다 큰 경우에는 10이라는 값을 부여해주었습니다.
3단계: 두 테이블 UNION 해주기
1, 2단계에서 만들어준 테이블을 UNION을 사용해서 합쳐주면 문제 해결!
728x90
'Tool > SQL 코딩테스트 풀이' 카테고리의 다른 글
[LeetCode] 1193. Monthly Transactions I (Date_format 날짜 함수) (0) | 2023.12.24 |
---|---|
[LeetCode] 1174. Immediate Food Delivery II (집계함수에 조건 작성하기) (0) | 2023.12.22 |
[LeetCode] 1158. Market Analysis I (JOIN에 AND 조건 사용하기) (0) | 2023.12.19 |
[LeetCode] 585. Investments in 2016 (0) | 2023.12.13 |
[LeetCode] 177. Nth Highest Salary (0) | 2023.12.11 |
Comments