본문 바로가기
Data Science/SQL

[SQL/오답] 특정 시점의 가격 추적하기: 집계와 UNION을 이용한 조건별 데이터 통합 (LeetCode1164 Medium)

by 에르모사 쩐뉴 2026. 2. 8.

[리트코드] 1164. Product Price at a Given Date; UNION, WHERE (A,B) IN

 

1. Problem

2019년 8월 16일 기준, 모든 제품의 가격을 구해야 한다.

  • 조건 1: 8월 16일 이전에 가격 변동 기록이 있다면, 그중 가장 최근(마지막) 가격을 채택한다.
  • 조건 2: 8월 16일까지 아무런 가격 변동 기록이 없다면, 초기 가격인 10으로 설정한다.
  • 핵심 과제: 모든 제품(product_id)을 누락 없이 출력하면서, 각 제품이 처한 상황(기록 있음 vs 없음)에 따라 다른 로직을 적용해야 한다.

2. Solution: 두 집단의 논리적 결합

기록이 존재하는 집단과 초기 상태인 집단을 각각 구한 뒤 UNION으로 합친다.

3. Takeaway: 시계열 데이터 처리를 위한 객관적 분석

  • 다중 컬럼 IN 연산자의 정확성: (product_id, MAX(change_date)) 조합을 통해, 특정 시점 이전의 '최종 상태'를 정확히 타격했다. 이는 데이터가 꼬이지 않게 보장하는 가장 안전한 방식이다.
  • HAVING 절의 영리한 사용: MIN(change_date) > '2019-08-16' 조건은 "현재까지 단 한 번도 가격이 바뀐 적이 없는 제품"을 걸러내는 필터 역할을 한다. WHERE가 아닌 GROUP BY 이후의 집계 결과에 조건을 걸어 '집단'의 특징을 파악한 점이 훌륭하다.
  • 초기값 설정의 정밀도: 문제에서 제시한 "기본값 10"을 누락된 제품군에 강제로 할당하여, 데이터의 완전성(모든 제품 출력)을 확보했다.

Table: Products

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| new_price     | int     |
| change_date   | date    |
+---------------+---------+
(product_id, change_date) is the primary key (combination of columns with unique values) of this table.
Each row of this table indicates that the price of some product was changed to a new price at some date.
Initially, all products have price 10.

Write a solution to find the prices of all products on the date 2019-08-16.

Return the result table in any order.

The result format is in the following example.

 

Example 1:

Input: 
Products table:
+------------+-----------+-------------+
| product_id | new_price | change_date |
+------------+-----------+-------------+
| 1          | 20        | 2019-08-14  |
| 2          | 50        | 2019-08-14  |
| 1          | 30        | 2019-08-15  |
| 1          | 35        | 2019-08-16  |
| 2          | 65        | 2019-08-17  |
| 3          | 20        | 2019-08-18  |
+------------+-----------+-------------+
Output: 
+------------+-------+
| product_id | price |
+------------+-------+
| 2          | 50    |
| 1          | 35    |
| 3          | 10    |
+------------+-------+
SELECT product_id, new_price as  price
FROM Products
WHERE (product_id, change_date) IN (
    SELECT product_id, MAX(change_date)
    FROM Products
    WHERE change_date <= '2019-08-16'
    GROUP BY product_id
    )

UNION 

SELECT product_id, 10 AS price
FROM Products
GROUP BY product_id
HAVING MIN(change_date) > '2019-08-16'
;