월요일, 2월 15, 2021

[유튜브 방송] (즐겁게 배우는 SQL #49) 윈도우 함수 - 윈도우 함수(1)

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 49편을 공개해드리겠다. 49편은 윈도우 함수를 개괄하고 몇 가지 윈도우 함수를 소개한다.

2021년 2월 15일자 [즐겁게 배우는 SQL #49] 윈도우 함수 - 윈도우 함수(1) 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 윈도우 함수 개괄
  • 06:40 (순위) CUME_DIST(누적 분포)
  • 11:41 (순위) DENSE_RANK(순서있는 행들의 집합에서 행의 순위 계산, 빈 순서 없음)
  • 17:00 (값) FIRST_VALUE(정해진 윈도우 프레임 내에서 첫 행의 값을 반환)
  • 22:12 (값) LAG(직전에 물리적으로 떨어진 오프셋 값을 가져오기)

온라인 실습 사이트는 SQL Online IDE에서 진행하면 되고, 원본 학습자료는 SQLite Window Functions를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: 윈도우 함수 개괄
    1. 윈도우 함수는 현재 행을 기준으로 일련의 행 집합에 대해 연산을 수행한다
    2. 집계 함수는 계산 결과를 한 행으로 합치는 특성이 있는 반면에 윈도우 함수는 원래 행을 그대로 유지하는 특성이 있다
    3. 값과 순위를 매기는 함수가 대표적이다.
  • 단계 2: (순위) CUME_DIST(누적 분포)
    1. SQL> CREATE TABLE CumeDistDemo( Id INTEGER PRIMARY KEY, value INT );
    2. SQL> INSERT INTO CumeDistDemo(value) VALUES(1000),(1200),(1200),(1400),(2000);
    3. SQL> SELECT Id, Value FROM CumeDistDemo;
    4. SQL> SELECT Value, CUME_DIST() OVER ( ORDER BY value ) CumulativeDistribution FROM CumeDistDemo;
  • 단계 3: (순위) DENSE_RANK(순서있는 행들의 집합에서 행의 순위 계산, 빈 순서 없음)
    1. SQL> CREATE TABLE DenseRankDemo ( Val TEXT );
    2. SQL> INSERT INTO DenseRankDemo(Val) VALUES('A'),('B'),('C'),('C'),('D'),('D'),('E');
    3. SQL> SELECT Val, DENSE_RANK () OVER ( ORDER BY Val ) ValRank FROM DenseRankDemo;
    4. SQL> SELECT AlbumId, Name, Milliseconds, DENSE_RANK () OVER ( PARTITION BY AlbumId ORDER BY Milliseconds ) LengthRank FROM tracks;
  • 단계 4: (값) FIRST_VALUE(정해진 윈도우 프레임 내에서 첫 행의 값을 반환)
    1. SQL> SELECT Name, printf('%,d',Bytes) Size, FIRST_VALUE(Name) OVER ( ORDER BY Bytes ) AS SmallestTrack FROM tracks WHERE AlbumId = 1;
    2. SQL> SELECT AlbumId, Name, printf('%,d',Bytes) Size, FIRST_VALUE(Name) OVER ( PARTITION BY AlbumId ORDER BY Bytes DESC ) AS LargestTrack FROM tracks;
  • 단계 5: (값) LAG(직전에 물리적으로 떨어진 오프셋 값을 가져오기)
    1. SQL> SELECT * FROM CustomerInvoices ORDER BY CustomerId, Year, Total;
    2. SQL> SELECT CustomerId, Year, Total, LAG ( Total,1,0 ) OVER ( ORDER BY Year ) PreviousYearTotal FROM CustomerInvoices WHERE CustomerId = 4;
    3. SQL> SELECT CustomerId, Year, Total, LAG ( Total,1,0 ) OVER ( PARTITION BY CustomerId ORDER BY Year ) PreviousYearTotal FROM CustomerInvoices;
EOB

댓글 없음:

댓글 쓰기