inflearn logo
강의

Course

Instructor

Data Analysis SQL Fundamentals

Aggregate Analytic SQL Practice - 04

Group By 절에 작성하는 컬럼 문의드립니다.

5

dhleegarret

8 asked

0

안녕하세요!

product_id를 집계 기준으로 하는 GROUP BY 구문을 작성할 때, 해당 product_id와 맵핑되는 category_id은 SELECT절에서 max(category_id)으로 처리하는 방식으로 설명해주셨습니다.

혹시 아래처럼 category_id도 GROUP BY에 같이 작성한다면, 어떤 점이 다르며 이슈나 문제가 될만한 상황이 있는지 궁금합니다!

SELECT a.PRODUCT_ID, b.CATEGORY_ID, sum(amount) AS sum_by_prod
FROM nw.ORDER_ITEMS a
JOIN nw.PRODUCTS b ON a.PRODUCT_ID = b.PRODUCT_ID
GROUP BY a.PRODUCT_ID, b.CATEGORY_ID

sql postgresql dbms/rdbms 데이터-엔지니어링

Answer 2

0

dooleyz3525

안녕하십니까,

말씀하신대로 group by a.product_id, b.category_id 하셔도 본 데이터 세트에서는 결과가 동일하게 나옵니다. 그리고 본 데이터 세트가 아니더라도 대부분의 경우, 결과가 동일할 것입니다.

하지만 group by를 적용해서 만들어지는 집합의 레벨을 명확하게 해주는게 좋습니다. group by 로 만들어지는 집합의 레벨이 product_id 레벨이므로 group by 절에 product_id 단독으로 기술한 것입니다. category_id는 select 절에서 필요한 가공값이므로 이를 max(category)를 적용해서 가져왔습니다. 이렇게 SQL을 작성하면 group by 레벨의 집합, 그리고 추가적인 정보 컬럼(여기서는 category_id)가 어떤 것인지 명확히 나타내게 됩니다.

반면에 group by a.product_id, b.category_id 를 하셔도 결과는 차이가 없지만, group by 를 product_id + category_id 더 세분화해서 group by를 수행하는 의미로 전달 될 수 있습니다. 즉 group by 레벨이 product_id + category_id 라고 명시하는 것이고, 이는 제가 원래 뜻한 바와는 차이가 있을 수 있습니다.

물론 product_id가 category_id와 상관없이 unique 한 값이므로, 이렇게 하셔도 동일한 결과가 되지만, 만약에 동일한 product_id가 서로 다른 category_id에 있을 수 있다면 결과는 달라 질 수도 있습니다(product_id 001이, category_id A, B 에 소속됨) 그리고 DB가 group by 시 정렬을 product_id + category로 좀 더 불필요한 I/O로 정렬을 수행할 수도 있습니다(물론 대용량이 아니라면 성능 차이는 크지 않습니다)

요약드리자면, group by 수행 시 group by가 적용되어야 할 레벨을 명확히 지정해 주는게 좋습니다. 추가적인 select 값 속성을 위해서 group by 컬럼들을 추가하는 건 다른 사람이 보기에 이해에 혼돈(?)을 가져올 우려가 있습니다. 다만 select 값에 추가적인 처리가 너무 복잡해서 group by 절에 컬럼을 추가해서 해결 할 수 있다면, 그렇게 하셔도 좋을 것 같습니다.

아래에도 비슷한 질문에 대한 답변 내용이 있으니, 참고하시기 바랍니다. 감사합니다.

https://inf.run/sN2w2

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

dhleegarret님, 질문하신 쿼리처럼 product_idcategory_id를 함께 GROUP BY에 작성해도 일반적으로는 문제가 없습니다.

product_id가 항상 하나의 category_id에만 매핑되는 구조라면 아래 두 방식의 결과는 동일합니다.

  • GROUP BY product_id, category_id
  • GROUP BY product_idMAX(category_id) 사용

즉, product_idcategory_id가 1:1로 대응된다면 두 컬럼을 함께 그룹화해도 결과 행의 기준은 사실상 상품별로 동일합니다. 강의에서는 집계 대상의 레벨이 product_id라는 점을 명확히 표현하기 위해 category_idMAX()로 처리한 것입니다.

다만 하나의 product_id가 여러 category_id에 매핑될 수 있는 데이터라면 결과가 달라질 수 있습니다. 이 경우 GROUP BY product_id, category_id는 상품과 카테고리 조합별로 여러 행을 만들지만, GROUP BY product_id는 상품별로 하나의 그룹만 만들기 때문입니다. 따라서 현재처럼 상품 하나가 하나의 카테고리에만 속한다는 데이터 무결성이 보장된다면 두 방식 모두 사용할 수 있습니다.

관련 내용은 아래 기존 답변에서 자세히 확인하실 수 있습니다.

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

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

최신버젼 다운로드

0

77

2

'레벨 유지'의 의미에 대한 질문

0

92

2

date_part

0

106

2

lag/lead offset 관련 질문

0

94

2

join 관련 질문 (inner join, left join)

1

127

2

배치에서 full outer join을 쓴다고 하셨는데 예시를 알 수 있을까요?

0

126

2

Madrid에 살고 있는 고객이 주문한 주문 정보를 구할것. 실습 질문드립니다

0

83

2

rollup시 null값 매출 라벨링

0

100

2

10. 조인 실습 - 02 관련 질문

0

92

1

조인실습03 - join의 pk-fk join

0

145

2

조인실습03 - join의 pk-fk join

0

104

2

(공유)맥, 스키마 import

0

109

2

sql 입문자인데, 이 강의와 sql 코딩테스트와 연관이 있을까요?

0

162

2

1인지 M인지는 결국엔 테이블을 직접 확인을 해야 하는걸까요?

0

154

2

안녕하세요. 튜닝핵심가이드강의 관련해서 여쭤보고 싶어서 남깁니다.

0

111

1

섹션5 Group by 실습-01 강의 예제 질문

0

154

2

섹션2 조인 기반 메커니즘에서 조인 실습 - 04 강의 예제 질문

0

144

2

섹션2 조인 실습 01 강의 질문

0

163

2

lead lag 이해 강의에서 윈도우 절은 사용되지 않습니다.

0

156

1

Dbeaver오류

0

736

2

직원 별 가장 높은 매출

0

142

1

강의순서대로 실습코드순알려주세요.

0

162

1

m:n inner join일 경우 cross조인과 동일하게 동작되는건가요?

0

160

1

rollup

0

111

2