SQL 고급_윈도우 함수

Eunjung-Cho·2021년 7월 14일
0

SQL

목록 보기
13/16

Window 함수

  • GROUP BY랑 비슷한 기능

    GROUP BY :

  • But, 한줄로 요약해서 보여주는 것이 아니라 각각의 raw에다가 그 결과물을 쭉 찍어준다.

모양새

  • 함수(컬럼1) OVER (PARTITION BY 컬럼2 ORDER BY 컬럼3)

    컬럼2에는 그룹별로 보고 싶은 컬럼을 쓰면 된다.
    PARTITION BY 컬럼2 ORDER BY 컬럼3 은 두개다 있어도 되고 없어도된다.

집계함수

MAX(컬럼) OVER (PARTITION BY 컬럼)

  • 예시:
SELECT Id
	 , Name
     , Salary
     , Department
     , MAX(Salary) OVER (PARTITION BY DepartmentId) AS MaxSalary
FROM Employee


여기에
max_sal 열이 추가된다.

  • 원래의 table에 그룹으로 보여준 열이 추가되어 보여준다 라고 생각

SUM(컬럼) OVER (ORDER BY 컬럼)

  • 누적합 : 윈도우 함수 사용 / 윈도우 함수 사용x
SELECT Id
	 , Name
     , kg
     , Line
     , SUM(kg) OVER (ORDER BY Line) AS CumSum 
FROM Elevator

SUM(kg) OVER (ORDER BY DepartmentId) -> 누적합

SUM(컬럼) OVER (ORDER BY 컬럼 PARTITION BY 컬럼)

  • 누적합 : 윈도우 함수 사용 / 윈도우 함수 사용x
SELECT Id
	 , Name
     , kg
     , Line
     , SUM(kg) OVER (ORDER BY Line PARTITION BY Id) AS CumSum 
FROM Elevator

여러 집계함수 사용 가능

AVG()
BIT_AND()
BIT_OR()
BIT_XOR()
COUNT()
JSON_ARRAYAGG()
JSON_OBJECTAGG()
MAX()
MIN()
STDDEV_POP(), STDDEV(), STD()
STDDEV_SAMP()
SUM()
VAR_POP(), VARIANCE()
VAR_SAMP()

순위 정하기

ROW_NUMBER(), RANK(), DENSE_RANK()

  • 괄호 안에 인자가 들어가지 않음
SELECT
         val,
         ROW_NUMBER() OVER w AS 'row_number',
         RANK()       OVER w AS 'rank',
         DENSE_RANK() OVER w AS 'dense_rank'
FROM numbers
       WINDOW w AS (ORDER BY val);

ROW_NUMBER() :

  • 중복되는 순위는 없다.

RANK():

  • 중복순위가 있다.

DENSE_RANK()

  • 1등이 2명있어도 2등이 있다. 숫자가 비는 것 없이 랭크가 매겨진다.

데이터 위치 바꾸기

LAG 함수, LEAD 함수

  • LAG(컬럼1): 컬럼1의 데이터를 한칸씩 미룸 (맨 앞줄 NULL)
  • LEAD(컬럼1): 컬럼1의 데이터를 한칸 당김 (맨 뒷줄 NULL)
SELECT
         t, val,
         LAG(val)        OVER w AS 'lag',
         LEAD(val)       OVER w AS 'lead',
         val - LAG(val)  OVER w AS 'lag diff',
         val - LEAD(val) OVER w AS 'lead diff'
       FROM series
       WINDOW w AS (ORDER BY t);

SELECT
         n,
         LAG(n, 1, 0)      OVER w AS 'lag',
         LEAD(n, 1, 0)     OVER w AS 'lead',
         n + LAG(n, 1, 0)  OVER w AS 'next_n',
         n + LEAD(n, 1, 0) OVER w AS 'next_next_n'
       FROM fib
       WINDOW w AS (ORDER BY n);

  • LAG(컬럼) OVER (PARTITION BY 컬럼 ORDER BY 컬럼)
  • LAG(컬럼, 칸수) OVER (PARTITION BY 컬럼 ORDER BY 컬럼) -> 한칸씩이 아니라 내가 넣은 칸수 개수대로 밀고싶다.
  • LAG(컬럼, 칸수, Default값) OVER (PARTITION BY 컬럼 ORDER BY 컬럼) -> null데이터가 아니라 default값을 넣고 싶다.
  • LEAD(컬럼) OVER (PARTITION BY 컬럼 ORDER BY 컬럼)
  • LEAD(컬럼, 칸수) OVER (PARTITION BY 컬럼 ORDER BY 컬럼)
  • LEAD(컬럼, 칸수, Default값) OVER (PARTITION BY 컬럼 ORDER BY 컬럼)
profile
IT컨설팅 데이터 분석가

0개의 댓글