PostgreSQL Summary Stats and Window Functions
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 คือ subclause ของ GROUP BY ที่เพิ่มแถวสำหรับการรวมข้อมูลระดับกลุ่มGROUP BY Country, ROLLUP(Medal) จะนับยอดรวมระดับ Country และ Medal แล้วนับเฉพาะระดับ Country โดยใส่ null ใน Medal สำหรับแถวเหล่านั้น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 คือ ROLLUP แบบไม่มีลำดับชั้นCUBE(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 รวมอยู่ด้วย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 Summary Stats and Window Functions