Thống kê tóm tắt và Window Functions trong PostgreSQL
Michel Semaan
Data Scientist
Truy vấn
WITH Discus_Gold AS (
SELECT
Year, Event, Country AS Champion
FROM Summer_Medals
WHERE
Year IN (2004, 2008, 2012)
AND Gender = 'Men' AND Medal = 'Gold'
AND Event IN ('Discus Throw', 'Triple Jump')
AND Gender = 'Men')
SELECT
Year, Event, Champion,
LAG(Champion) OVER
(ORDER BY Event ASC, Year ASC) AS Last_Champion
FROM Discus_Gold
ORDER BY Event ASC, Year ASC;
Kết quả
| Year | Event | Champion | Last_Champion |
|------|--------------|----------|---------------|
| 2004 | Discus Throw | LTU | null |
| 2008 | Discus Throw | EST | LTU |
| 2012 | Discus Throw | GER | EST |
| 2004 | Triple Jump | SWE | GER |
| 2008 | Triple Jump | POR | SWE |
| 2012 | Triple Jump | USA | POR |
Event đổi từ Discus Throw sang Triple Jump, LAG lấy nhà vô địch cuối của Discus Throw thay vì nullPARTITION BY chia bảng thành các phần theo giá trị duy nhất của cộtROW_NUMBER sẽ đặt lại cho từng phầnLAG chỉ lấy giá trị trước nếu hàng trước ở cùng phầnTruy vấn
WITH Discus_Gold AS (...)
SELECT
Year, Event, Champion,
LAG(Champion) OVER
(PARTITION BY Event
ORDER BY Event ASC, Year ASC) AS Last_Champion
FROM Discus_Gold
ORDER BY Event ASC, Year ASC;
Kết quả
| Year | Event | Champion | Last_Champion |
|------|--------------|----------|---------------|
| 2004 | Discus Throw | LTU | null |
| 2008 | Discus Throw | EST | LTU |
| 2012 | Discus Throw | GER | EST |
| 2004 | Triple Jump | SWE | null |
| 2008 | Triple Jump | POR | SWE |
| 2012 | Triple Jump | USA | POR |
| Year | Country | Event | Row_N |
|------|---------|----------------------|-------|
| 2008 | CHN | + 78KG (Heavyweight) | 1 |
| 2008 | CHN | - 49 KG | 2 |
| ... | ... | ... | ... |
| 2008 | JPN | 48 - 55KG | 27 |
| 2008 | JPN | 48 - 55KG | 28 |
| ... | ... | ... | ... |
| 2012 | CHN | +75KG | 32 |
| 2012 | CHN | - 49 KG | 33 |
| ... | ... | ... | ... |
| 2012 | JPN | +75KG | 51 |
| 2012 | JPN | - 49 KG | 52 |
| ... | ... | ... | ... |
Year và CountryTruy vấn
WITH Country_Gold AS (
SELECT
DISTINCT Year, Country, Event
FROM Summer_Medals
WHERE
Year IN (2008, 2012)
AND Country IN ('CHN', 'JPN')
AND Gender = 'Women' AND Medal = 'Gold')
SELECT
Year, Country, Event,
ROW_NUMBER() OVER (PARTITION BY Year, Country)
FROM Country_Gold;
Kết quả
| Year | Country | Event | Row_N |
|------|---------|----------------------|-------|
| 2008 | CHN | + 78KG (Heavyweight) | 1 |
| 2008 | CHN | - 49 KG | 2 |
| ... | ... | ... | ... |
| 2008 | JPN | 48 - 55KG | 1 |
| 2008 | JPN | 48 - 55KG | 2 |
| ... | ... | ... | ... |
| 2012 | CHN | +75KG | 1 |
| 2012 | CHN | - 49 KG | 2 |
| ... | ... | ... | ... |
| 2012 | JPN | +75KG | 1 |
| 2012 | JPN | - 49 KG | 2 |
| ... | ... | ... | ... |
Thống kê tóm tắt và Window Functions trong PostgreSQL