ROLLUP과 CUBE

PostgreSQL 요약 통계와 윈도 함수

Michel Semaan

Data Scientist

그룹 수준 합계

2008년 하계 올림픽 중국·러시아의 메달 종류별 획득 수

| Country | Medal  | Awards |
|---------|--------|--------|
| CHN     | Bronze | 57     |
| CHN     | Gold   | 74     |
| CHN     | Silver | 53     |
| CHN     | Total  | 184    |
| RUS     | Bronze | 56     |
| RUS     | Gold   | 43     |
| RUS     | Silver | 44     |
| RUS     | Total  | 143    |
PostgreSQL 요약 통계와 윈도 함수

기존 방식

SELECT
  Country, Medal, COUNT(*) AS Awards
FROM Summer_Medals
WHERE
  Year = 2008 AND Country IN ('CHN', 'RUS')
GROUP BY Country, Medal
ORDER BY Country ASC, Medal ASC

UNION ALL SELECT Country, 'Total', COUNT(*) AS Awards FROM Summer_Medals WHERE Year = 2008 AND Country IN ('CHN', 'RUS') GROUP BY Country, 2 ORDER BY Country ASC;
PostgreSQL 요약 통계와 윈도 함수

ROLLUP 소개

SELECT
  Country, Medal, COUNT(*) AS Awards
FROM Summer_Medals
WHERE
  Year = 2008 AND Country IN ('CHN', 'RUS')
GROUP BY Country, ROLLUP(Medal)
ORDER BY Country ASC, Medal ASC;
  • ROLLUP은 그룹 수준 집계 행을 추가하는 GROUP BY 하위 절입니다
  • GROUP BY Country, ROLLUP(Medal)CountryMedal 수준 합계를 집계한 후, Country 수준 합계만 집계하고 해당 행의 Medalnull로 채웁니다
PostgreSQL 요약 통계와 윈도 함수

ROLLUP - 쿼리

SELECT
  Country, Medal, COUNT(*) AS Awards
FROM summer_medals
WHERE
  Year = 2008 AND Country IN ('CHN', 'RUS')
GROUP BY ROLLUP(Country, Medal)
ORDER BY Country ASC, Medal ASC;
  • ROLLUP은 계층적으로, 가장 왼쪽 열부터 오른쪽 열 순서로 집계를 해제합니다
    • ROLLUP(Country, Medal)Country 수준 합계를 포함합니다
    • ROLLUP(Medal, Country)Medal 수준 합계를 포함합니다
    • 두 경우 모두 총합을 포함합니다
PostgreSQL 요약 통계와 윈도 함수

ROLLUP - 결과

| Country | Medal  | Awards |
|---------|--------|--------|
| CHN     | Bronze | 57     |
| CHN     | Gold   | 74     |
| CHN     | Silver | 53     |
| CHN     | null   | 184    |
| RUS     | Bronze | 56     |
| RUS     | Gold   | 43     |
| RUS     | Silver | 44     |
| RUS     | null   | 143    |
| null    | null   | 327    |
  • 그룹 수준 합계 행에는 null이 포함되며, 모든 열이 null인 행이 총합입니다
  • ROLLUP(Country, Medal)이므로 Medal 수준 합계는 포함되지 않습니다 (ROLLUP(Medal, Country)와 다름)
PostgreSQL 요약 통계와 윈도 함수

CUBE 소개

SELECT
  Country, Medal, COUNT(*) AS Awards
FROM summer_medals
WHERE
  Year = 2008 AND Country IN ('CHN', 'RUS')
GROUP BY CUBE(Country, Medal)
ORDER BY Country ASC, Medal ASC;
  • CUBE는 비계층적 ROLLUP
  • 가능한 모든 그룹 수준 집계를 생성합니다
    • CUBE(Country, Medal)Country 수준, Medal 수준, 총합을 집계합니다
PostgreSQL 요약 통계와 윈도 함수

CUBE - 결과

| Country | Medal  | Awards |
|---------|--------|--------|
| CHN     | Bronze | 57     |
| CHN     | Gold   | 74     |
| CHN     | Silver | 53     |
| CHN     | null   | 184    |
| RUS     | Bronze | 56     |
| RUS     | Gold   | 43     |
| RUS     | Silver | 44     |
| RUS     | null   | 143    |
| null    | Bronze | 113    |
| null    | Gold   | 117    |
| null    | Silver | 97     |
| null    | null   | 327    |
  • Medal 수준 합계가 포함된 것을 확인하십시오
PostgreSQL 요약 통계와 윈도 함수

ROLLUP vs CUBE

Source

| Year | Quarter | Sales |
|------|---------|-------|
| 2008 | Q1      | 12    |
| 2008 | Q2      | 15    |
| 2009 | Q1      | 21    |
| 2009 | Q2      | 27    |
  • 계층적 데이터(예: 날짜 구성 요소)에는 ROLLUP 사용 — 모든 그룹 수준 집계가 불필요한 경우
  • 가능한 모든 그룹 수준 집계가 필요한 경우 CUBE 사용

ROLLUP(Year, Quarter)

| Year | Quarter | Sales |
|------|---------|-------|
| 2008 | null    | 27    |
| 2009 | null    | 48    |
| null | null    | 75    |

CUBE(Year, Quarter)

위 행 + 다음 행 추가

| Year | Quarter | Sales |
|------|---------|-------|
| null | Q1      | 33    |
| null | Q2      | 42    |
PostgreSQL 요약 통계와 윈도 함수

연습해 봅시다!

PostgreSQL 요약 통계와 윈도 함수

Preparing Video For Download...