1327. List the Products Ordered in a Period : leetcode

오유찬·2026년 1월 15일

SQL

목록 보기
51/71
-- '2020-02'에 주문된 상품들 + 최소 100개 이상
WITH cte as (
    SELECT  product_id, order_date, SUM(unit) as unit
    FROM    orders
    WHERE   DATE_FORMAT(order_date, "%Y-%m") = '2020-02'
    GROUP BY
            product_id
    HAVING  SUM(unit) > 99 
)

SELECT  p.product_name, c.unit
FROM    Products p INNER JOIN cte c 
        ON p.product_id = c.product_id

날짜를 필터링할 때 사용할 수 있는 방법은 크게 세 가지가 있다.

  • A) DATE_FORMAT
  • B) BETWEEN A AND B
  • C) A AND B

뭐가 가장 효율적일까?
(C) 방법이 가장 효율적이다. DB의 Index 사용 가능 여부 때문인데,
order_date를 가공하지 않고 원본 값으로 사용하기 때문에 DB는 인덱스를 타고 범위를 지정해서 출력만 하면 된다.

(B) 방법도 인덱스를 활용하는 것 같지만 DATETIME으로 설정된 경우 데이터가 누락될 수 있어 2020-02-29 00:00:002020-02-29 14:00:00가 다르게 조회됨에 유의해야 한다.

(C) 방법은 order_date를 가공하여 인덱스를 타지 못하기 때문에 Full Table Scan을 하여 데이터가 많아질수록 쿼리가 느려진다.

profile
열심히 하면 재밌다

0개의 댓글