인프런 커뮤니티 질문&답변

최원빈님의 프로필 이미지
최원빈

작성한 질문수

데이터 분석 SQL Fundamentals

집계(Aggregate) Analytic SQL 실습 - 04

max(b.category_id) 관련 질문이 있어요

작성

·

172

0

안녕하세요 오늘도 좋은 강의 감사합니다.

다름이 아니라 첫번째 with temp_01 as 쿼리를 시작하시는 부분에 질문이 있어요.

처음에 group by를 하실 때, product_id만 하시고 categroy_id는 크게 할 필요가 없으시다는 말씀을 하셨던 부분 이해를 완료했습니다.

 

그런데 선생님의 강의를 듣기 전에, 제가 문제를 먼저 풀었을 때 저는 group by에 category_id도 같이 추가를 하여 문제를 풀었습니다.

확인해보니 답은 동일하게 나왔더라고요. 

그럼 제가 했던 방식으로 하여도 전혀 문제가 없는 것일까요? 혹시 몰라 제가 짰던 쿼리를 밑에 남겨놓겠습니다! 

(일부 알리아스 이름은 선생님께서 하신 부분과 비슷하게 맞춰놓았습니다)

with temp_01

as

(

select p.category_id 

, p.product_id 

    , sum(oi.amount) sum_by_product -- 상품별 총합 

from nw.order_items oi

    join nw.products p 

    on oi.product_id = p.product_id 

group by p.category_id, p.product_id

),

temp_02

as

(

select category_id

     , product_id 

     , sum_by_product

     , sum(sum_by_product) over (partition by category_id) sum_by_category -- category별 총합

     , row_number() over (partition by category_id order by sum_by_product desc) ranking_category  -- 카테고리별 상품 순위  

from temp_01

)

select *

from temp_02

where sum_by_product >= 0.05*sum_by_category and ranking_category <= 3

order by category_id;

 

답변 2

2

권 철민님의 프로필 이미지
권 철민
지식공유자

오, 벌써 Analytic SQL 실습을 하시나요? 진도가 빠르시군요. 

제가 group by 를 product_id만 하고 category_id는 할 필요가 없다는 것은 집합의 레벨을 명확하게 인지하는 습관을 갖추시기를 수강생 분들에게 전달하고자 함입니다. 

group by 를 사용할 경우 select 절에 올 수 있는 것은 group by 절 컬럼과 aggregation 함수값입니다. 

그런데 select 절에 product_id와 category_id가 필요하다면 group by 절에 category_id와 product_id가 다 필요합니다.

우리가 만들고자하는 집합의 레벨은 명확하게 product_id로 고유한 집합 입니다.  그리고 고유한 product_id는 단 하나의 category_id에 소속 됩니다. 즉 product_id의 카테고리는 단 하나입니다.  때문에 product_id 레벨과 category_id + product_id 레벨은 서로 동일합니다. 

그렇지만 SQL을 기술할 때 명확하게 만들어 지는 집합의 레벨을 직관적으로 이해하기 쉽도록 작성해 줄 필요가 있습니다. 때문에 group by 를 product_id로만 하고 category_id는 max(category_id)로 구했습니다. 즉 하나의 product_id는 하나의 category_id만을 가지기 때문에 max()를 취하지 않아도 나오면 좋으나 SQL group by 절의 특성상 그렇게 허용을 하지 않기 때문에 max(category_id)로 기재를 한 것입니다.  이렇게 하면 명확하게 집합의 레벨의 SQL 작성시 이해가 될 수 있습니다. 

Category_id + product_id 로 group by 가 잘못되었다는 애기는 절대 아닙니다. 그렇게 하셔도 됩니다. 다만 처음에 배울때 집합의 레벨을 명확히 이해하는 버릇을 들이는 것은 SQL을 배울 때 매~우 중요하기 때문에 제가 그렇게 기재를 한 것입니다. 

감사합니다. 

"집합의 레벨을 명확히 이해하는 버릇을 들이는 것은 SQL을 배울 때 매~우 중요하기 때문에" 이해했습니다. max말고 distinct라던가 하나만 가져오는 함수 써도 되는거겠죠?

권 철민님의 프로필 이미지
권 철민
지식공유자

네, 다른 함수 사용하셔도 됩니다.

0

최원빈님의 프로필 이미지
최원빈
질문자

답변 감사합니다!:)

최원빈님의 프로필 이미지
최원빈

작성한 질문수

질문하기