-- '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
날짜를 필터링할 때 사용할 수 있는 방법은 크게 세 가지가 있다.
DATE_FORMATBETWEEN A AND BA AND B 뭐가 가장 효율적일까?
(C) 방법이 가장 효율적이다. DB의 Index 사용 가능 여부 때문인데,
order_date를 가공하지 않고 원본 값으로 사용하기 때문에 DB는 인덱스를 타고 범위를 지정해서 출력만 하면 된다.
(B) 방법도 인덱스를 활용하는 것 같지만 DATETIME으로 설정된 경우 데이터가 누락될 수 있어 2020-02-29 00:00:00와 2020-02-29 14:00:00가 다르게 조회됨에 유의해야 한다.
(C) 방법은 order_date를 가공하여 인덱스를 타지 못하기 때문에 Full Table Scan을 하여 데이터가 많아질수록 쿼리가 느려진다.