Підсумкова статистика та віконні функції в 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 |
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 ASCUNION 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;
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) підрахує підсумки для рівнів Country і Medal, а потім лише для Country, заповнивши Medal значеннями null у цих рядках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) включає підсумки на рівні CountryROLLUP(Medal, Country) включає підсумки на рівні Medal| 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 — це загальний підсумокMedal, бо це ROLLUP(Country, Medal), а не ROLLUP(Medal, Country)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 — неієрархічний різновид ROLLUPCUBE(Country, Medal) рахує підсумки рівнів Country, Medal і загальний підсумок| 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Джерело
| 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