max(b.category_id) 관련 질문이 있어요
284
작성한 질문수 45
안녕하세요 오늘도 좋은 강의 감사합니다.
다름이 아니라 첫번째 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을 배울 때 매~우 중요하기 때문에 제가 그렇게 기재를 한 것입니다.
감사합니다.
0
"집합의 레벨을 명확히 이해하는 버릇을 들이는 것은 SQL을 배울 때 매~우 중요하기 때문에" 이해했습니다. max말고 distinct라던가 하나만 가져오는 함수 써도 되는거겠죠?
'레벨 유지'의 의미에 대한 질문
0
52
2
date_part
0
55
2
lag/lead offset 관련 질문
0
55
2
join 관련 질문 (inner join, left join)
1
99
2
배치에서 full outer join을 쓴다고 하셨는데 예시를 알 수 있을까요?
0
89
2
Madrid에 살고 있는 고객이 주문한 주문 정보를 구할것. 실습 질문드립니다
0
53
2
rollup시 null값 매출 라벨링
0
54
2
10. 조인 실습 - 02 관련 질문
0
59
1
조인실습03 - join의 pk-fk join
0
108
2
조인실습03 - join의 pk-fk join
0
68
2
(공유)맥, 스키마 import
0
81
2
sql 입문자인데, 이 강의와 sql 코딩테스트와 연관이 있을까요?
0
137
2
1인지 M인지는 결국엔 테이블을 직접 확인을 해야 하는걸까요?
0
130
2
안녕하세요. 튜닝핵심가이드강의 관련해서 여쭤보고 싶어서 남깁니다.
0
91
1
섹션5 Group by 실습-01 강의 예제 질문
0
117
2
섹션2 조인 기반 메커니즘에서 조인 실습 - 04 강의 예제 질문
0
123
2
섹션2 조인 실습 01 강의 질문
0
133
2
lead lag 이해 강의에서 윈도우 절은 사용되지 않습니다.
0
126
1
Dbeaver오류
0
630
2
직원 별 가장 높은 매출
0
118
1
강의순서대로 실습코드순알려주세요.
0
133
1
m:n inner join일 경우 cross조인과 동일하게 동작되는건가요?
0
130
1
rollup
0
91
2
Dbeaver에 접속해도 postgressql이 네비게이터에 안보입니다.
0
355
2





