윈도우 함수

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 등에서 사용 가능
    • 단 NOT SQLite
SQL 데이터 조작

연습해봅시다!

SQL 데이터 조작

Preparing Video For Download...