PostgreSQL 요약 통계와 윈도 함수
Michel Semaan
Data Scientist
쿼리
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;
결과
| 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가 Discus Throw에서 Triple Jump로 바뀔 때, LAG는 null이 아닌 Discus Throw의 마지막 우승자를 가져왔습니다PARTITION BY는 열의 고유값으로 테이블을 파티션으로 나눕니다ROW_NUMBER는 파티션마다 다시 시작됩니다LAG는 이전 행이 같은 파티션에 있을 때만 이전 값을 가져옵니다쿼리
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;
결과
| 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와 Country별로 리셋되어야 합니다쿼리
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;
결과
| 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 |
| ... | ... | ... | ... |
PostgreSQL 요약 통계와 윈도 함수