[PostgreSQL] Group by와 집계 함수
카테고리: SQL
태그: Data Engineering
인프런에 있는 권철민님의 데이터 분석 SQL Fundamentals 강의를 듣고 정리한 내용입니다.
🐘 Group by
- Group화 한 데이터를 토대로 집계 함수(Aggregation function)와 함께 사용
- Group by에 사용한 column이 primary key 역할 가능
SELECT
genre,
SUM(qty) AS total
FROM MOVIE
GROUP BY genre
GROUPING SET
SELECT *
FROM TABLE1
GROUP BY
GROUPING SETS
(
(COL1),
(COL2),
(COL3)
)
- (GROUP BY COL1) UNION ALL (GROUP BY COL2) UNION ALL (GROUP BY COL3)와 같음
- GORUPING 함수는 해당 행 기준 column이 집계에 사용되었으면 0, 그렇지 않으면 1을 리턴함
- 이를 활용하면 다음과 같이 가공하기 좋음
개키우는 개발자 님의 블로그를 참고했습니다.
SELECT
CASE
WHEN GROUPING(BRAND) = 0 AND GROUPING(SEGMENT) = 0 THEN '브랜드별+등급별'
WHEN GROUPING(BRAND) = 0 AND GROUPING(SEGMENT) = 1 THEN '브랜드별'
WHEN GROUPING(BRAND) = 1 AND GROUPING(SEGMENT) = 0 THEN '등급별'
WHEN GROUPING(BRAND) = 1 AND GROUPING(SEGMENT) = 1 THEN '전체집계'
ELSE ''
END AS "집계기준",
BRAND,
SEGMENT,
SUM(QUANTITY)
FROM
SALES
GROUP BY
GROUPING SETS ( (BRAND,
SEGMENT),
(BRAND),
(SEGMENT),
() )
ORDER BY
BRAND,
SEGMENT
Having
SELECT
CUSTOMER_ID,
SUM(AMOUNT) AS AMOUNT_SUM
FROM PAYMENT
GROUP BY CUSTOMER_ID
HAVING SUM(AMOUNT) > 200 -- 필터링
ORDER BY CUSTOMER_ID; -- 정렬
- GROUP BY 후 필터링
Aggregation Function
Function | Description |
---|---|
Count | 데이터 건수 리턴 |
Count(distinct col) | Group by에 사용한 column 값 중 중복을 제외하고 count |
Sum(col) | 총 합 리턴 |
Min(col) | 최솟값 리턴 |
Max(col) | 최댓값 리턴 |
Avg(col) | 평균값 리턴 |
- NULL값은 집계에서 제외함
- 집계하고 싶다면 Coalesce 함수 이용
- Min, Max의 경우 date, timestamp 등의 타입에서도 가능
응용 - 행 레벨 데이터 열 레벨로 전환하기
Year | Month | Revenue |
---|---|---|
2016 | 1 | 10 |
2016 | 2 | 25 |
2016 | 3 | 40 |
2016 | … | … |
2016 | 12 | 78 |
SELECT
Year, sum(revenue) as Year_rev,
sum(case when Month = 1 then revenue end) as January,
sum(case when Month = 2 then revenue end) as February,
...
sum(case when Month = 12 then revenue end) as December,
FROM sales
GROUP BY Year
Year | Year_rev | January | February | … | December |
---|---|---|---|---|---|
2016 | 450 | 10 | 25 | … | 78 |
ROLLUP
SELECT
Type, Store, sum(Number) as Number
FROM Pet
GROUP BY ROLLUP(Type, Store)
ORDER BY 1,2;
- 계층적인 방식으로 Group by 진행 (파라미터 순서 기준)
- n+1 번 Group by 수행 (n: rollup의 파라미터 갯수)
CUBE
SELECT
Type, Store, sum(Number) as Number
FROM Pet
GROUP BY CUBE(Type, Store)
ORDER BY 1,2;
- 파라미터별 동등한 기준으로 Group by 진행
- 2^n 번 Group by 수행 (n: cube의 파라미터 갯수)
댓글 남기기