SQL

[MySQL] COALESCE_가장 먼저 NULL이 아닌 값 반환

dydatablog 2025. 5. 5. 13:26
728x90

[문제]

https://leetcode.com/problems/product-price-at-a-given-date/submissions/1624481627/

 

[COALESCE 예시]

SELECT COALESCE(NULL, NULL, 'Apple', 'Banana');
-- 결과: 'Apple'

 

[함수 지원 DB 특징]

COALESCE 표준 SQL 다수 인자 가능, 범용적 사용 가능
IFNULL(a, b) MySQL 2개 인자만 비교, MySQL 전용
ISNULL(a, b) SQL Server 2개 인자만 비교, SQL Server 전용

 

[1차 시도]

SELECT product_id,
       COALESCE(
           MAX(CASE WHEN change_date <= '2019-08-16' THEN new_price END), 10
       ) AS price
FROM Products
GROUP BY product_id
;

 

다음 테스트에서는 통과

 

하지만 new_price가 중간에 가격이 낮아질 수도 있다면 통과되지 않음...!

 

[해결 방법] 

- product_id별 chage_date의 내림차순 랭킹 만들어서 가장 낮은 (rank = 1)인 값만 가져오기

- 2019-08-16 시점에 없는 애들은 10으로 가져오기

 

[정답 코드]

WITH cte AS (
SELECT *, RANK() OVER (PARTITION BY product_id ORDER BY change_date DESC) AS r 
FROM Products
WHERE change_date<= '2019-08-16'
)
SELECT product_id, new_price AS price
FROM cte
WHERE r = 1
UNION
SELECT product_id, 10 AS price
FROM Products
WHERE product_id NOT IN (SELECT product_id FROM cte)

 

728x90