윈도 함수

SQL에서의 데이터 조작

Mona Khalil

Data Scientist, Greenhouse Software

집계 값 다루기

  • 집계가 아닌 모든 열에 대해 GROUP BY가 필요함
SELECT
  country_id,
  season,
  date,
  AVG(home_goal) AS avg_home
FROM match
GROUP BY country_id;
ERROR: column "match.season" must appear in the GROUP BY 
clause or be used in an aggregate function
SQL에서의 데이터 조작

윈도 함수 소개

  • 이미 생성된 결과 집합(윈도)에서 계산 수행
  • 집계 계산
    • SELECT의 서브쿼리와 유사
    • 누계, 순위, 이동 평균
SQL에서의 데이터 조작

윈도 함수란?

  • 2011/2012 시즌 각 경기의 득점은 몇 점이며, 평균과 어떻게 비교되나요?
SELECT
  date,
  (home_goal + away_goal) AS goals,
  (SELECT AVG(home_goal + away_goal) 
     FROM match
     WHERE season = '2011/2012') AS overall_avg
FROM match
WHERE season = '2011/2012';
| date       | goals | overall_avg       |
|------------|-------|-------------------|
| 2011-07-29 | 3     | 2.71646           |
| 2011-07-30 | 2     | 2.71646           |
| 2011-07-30 | 4     | 2.71646           |
| 2011-07-30 | 1     | 2.71646           |
SQL에서의 데이터 조작

윈도 함수란?

  • 2011/2012 시즌 각 경기의 득점은 몇 점이며, 평균과 어떻게 비교되나요?
SELECT
    date,
    (home_goal + away_goal) AS goals,
    AVG(home_goal + away_goal) OVER() AS overall_avg
FROM match
WHERE season = '2011/2012';
| date       | goals | overall_avg       |
|------------|-------|-------------------|
| 2011-07-29 | 3     | 2.71646           |
| 2011-07-30 | 2     | 2.71646           |
| 2011-07-30 | 4     | 2.71646           |
| 2011-07-30 | 1     | 2.71646           |
SQL에서의 데이터 조작

RANK 생성하기

  • 득점 수를 기준으로 경기의 순위는 무엇인가요?
SELECT
    date,
    (home_goal + away_goal) AS goals
FROM match
WHERE season = '2011/2012';
| date       | goals |
|------------|-------|
| 2011-07-29 | 3     |
| 2011-07-30 | 2     |
| 2011-07-30 | 4     |
| 2011-07-30 | 1     |
SQL에서의 데이터 조작

RANK 생성하기

  • 득점 수를 기준으로 경기의 순위는 무엇인가요?
SELECT
    date,
    (home_goal + away_goal) AS goals,
    RANK() OVER(ORDER BY home_goal + away_goal) AS goals_rank
FROM match
WHERE season = '2011/2012';
| date       | goals | goals_rank |
|------------|-------|------------|
| 2012-04-28 | 0     | 1          |
| 2011-12-26 | 0     | 1          |
| 2011-09-10 | 0     | 1          |
| 2011-08-27 | 0     | 1          |
| 2012-01-07 | 0     | 1          |
SQL에서의 데이터 조작

RANK 생성하기

  • 득점 수를 기준으로 경기의 순위는 무엇인가요?
SELECT
    date,
    (home_goal + away_goal) AS goals,
    RANK() OVER(ORDER BY home_goal + away_goal DESC) AS goals_rank
FROM match
WHERE season = '2011/2012';
| date       | goals | goals_rank |
|------------|-------|------------|
| 2011-11-06 | 10    | 1          |
| 2011-08-28 | 10    | 1          |
| 2012-05-12 | 9     | 3          |
| 2012-02-12 | 9     | 3          |
| 2012-03-09 | 9     | 3          |
SQL에서의 데이터 조작

주요 차이점

  • ORDER BY를 제외한 쿼리의 모든 부분 처리 _후_ 에 수행됨
    • 데이터베이스가 아니라 결과 집합의 정보를 사용
  • PostgreSQL, Oracle, MySQL, SQL Server 등에서 사용 가능
    • 단, SQLite는 미지원
SQL에서의 데이터 조작

연습해 봅시다!

SQL에서의 데이터 조작

Preparing Video For Download...