1070. Product Sales Analysis III
WITH firstCTE as (
SELECT product_id, MIN(year) as first_year
FROM Sales
GROUP BY product_id
)
SELECT fC.product_id, fc.first_year, S.quantity, S.price
FROM firstCTE as fC
INNER JOIN Sales S ON fC.product_id = S.product_id
AND fC.first_year = S.year
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | PRIMARY | S | null | ALL | null | null | null | null | 3 | 100 | Using where |
| 1 | PRIMARY | null | ref | <auto_key0> | <auto_key0> | 10 | test.S.product_id,test.S.year | 2 | 100 | Using index | |
| 2 | DERIVED | Sales | null | ALL | null | null | null | null | 3 | 100 | Using temporary |
select product_id, year as first_year, quantity, price
from
(
select *, RANK() OVER(Partition by product_id order by year asc) as rn
from sales) A
where rn = 1


서브쿼리에서 만들어낸 rn을 기준으로 제품마다 first year에 해당하는 행을 찾을 수 있다
EXLPAIN 결과
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | PRIMARY | null | ref | <auto_key0> | <auto_key0> | 8 | const | 1 | 100 | null | |
| 2 | DERIVED | sales | null | ALL | null | null | null | null | 3 | 100 | Using filesort |
PARTITION BY col
기준 컬럼을 사용하여 데이터셋을 그룹화하고, 각 그룹(파티션) 내에서 독립적으로 작업(윈도우 함수)을 수행할 수 있게 하는 절
파티셔닝 된 각 행은 원래 행과 함께 반환된다
GROUP BY와의 차이점
윈도우 함수
RANKING
AGGREGATE
OFFSET