PostgreSQL 요약 통계와 윈도 함수
Michel Semaan
Data Scientist
쿼리
SELECT
Year, Event, Country,
ROW_NUMBER() OVER () AS Row_N
FROM Summer_Medals
WHERE
Medal = 'Gold';
결과*
| Year | Event | Country | Row_N |
|------|----------------------------|---------|-------|
| 1896 | 100M Freestyle | HUN | 1 |
| 1896 | 100M Freestyle For Sailors | GRE | 2 |
| 1896 | 1200M Freestyle | HUN | 3 |
| ... | ... | ... | ... |
OVER의 ORDER BY는 현재 행과 관련된 행의 순서를 정렬합니다ROW_NUMBER의 OVER 절에서 연도를 내림차순으로 정렬하면, 가장 최근 연도의 행에 1이 할당됩니다쿼리
SELECT
Year, Event, Country,
ROW_NUMBER() OVER (ORDER BY Year DESC) AS Row_N
FROM Summer_Medals
WHERE
Medal = 'Gold';
결과
| Year | Event | Country | Row_N |
|------|---------------|---------|-------|
| 2012 | Wg 96 KG | IRI | 1 |
| 2012 | 4X100M Medley | USA | 2 |
| 2012 | Wg 84 KG | RUS | 3 |
| ... | ... | ... | ... |
| 2008 | 50M Freestyle | BRA | 637 |
| 2008 | 96 - 120KG | CUB | 638 |
| ... | ... | ... | ... |
쿼리
SELECT
Year, Event, Country,
ROW_NUMBER() OVER
(ORDER BY Year DESC, Event ASC) AS Row_N
FROM Summer_Medals
WHERE
Medal = 'Gold';
결과
| Year | Event | Country | Row_N |
|------|---------|---------|-------|
| 2012 | + 100KG | FRA | 1 |
| 2012 | + 67 KG | SRB | 2 |
| 2012 | + 78KG | CUB | 3 |
| ... | ... | ... | ... |
쿼리
SELECT
Year, Event, Country,
ROW_NUMBER() OVER
(ORDER BY Year DESC, Event ASC) AS Row_N
FROM Summer_Medals
WHERE
Medal = 'Gold'
ORDER BY Country ASC, Row_N ASC;
결과
| Year | Event | Country | Row_N |
|------|---------|---------|-------|
| 2012 | 1500M | ALG | 36 |
| 2000 | 1500M | ALG | 1998 |
| 1996 | 1500M | ALG | 2662 |
| ... | ... | ... | ... |
OVER 내부의 ORDER BY는 외부의 ORDER BY보다 먼저 적용됩니다LAG 소개
LAG(column, n) OVER (...): 현재 행에서 n행 앞의 column 값을 반환합니다LAG(column, 1) OVER (...): 바로 이전 행의 값을 반환합니다쿼리
SELECT
Year, Country AS Champion
FROM Summer_Medals
WHERE
Year IN (1996, 2000, 2004, 2008, 2012)
AND Gender = 'Men' AND Medal = 'Gold'
AND Event = 'Discus Throw';
결과
| Year | Champion |
|------|----------|
| 1996 | GER |
| 2000 | LTU |
| 2004 | LTU |
| 2008 | EST |
| 2012 | GER |
쿼리
WITH Discus_Gold AS (
SELECT
Year, Country AS Champion
FROM Summer_Medals
WHERE
Year IN (1996, 2000, 2004, 2008, 2012)
AND Gender = 'Men' AND Medal = 'Gold'
AND Event = 'Discus Throw')
SELECT
Year, Champion,
LAG(Champion, 1) OVER
(ORDER BY Year ASC) AS Last_Champion
FROM Discus_Gold
ORDER BY Year ASC;
결과
| Year | Champion | Last_Champion |
|------|----------|---------------|
| 1996 | GER | null |
| 2000 | LTU | GER |
| 2004 | LTU | LTU |
| 2008 | EST | LTU |
| 2012 | GER | EST |
PostgreSQL 요약 통계와 윈도 함수