Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

forest_moon

[SQL] Window Function 윈도우 함수 본문

SQL

[SQL] Window Function 윈도우 함수

rokga 2023. 5. 30. 17:40

윈도우 함수(Window Functoin)

 

윈도우 함수란  행과 행간의 관계를 쉽게 정의하기 위해 만들어진 함수를 말한다

분석함수 또는 순위함수라고 불리고, 다른 함수들 처럼 중첩해서 사용할 수는 없지만 서브쿼리는 사용이 가능하다.

 

기존 SQL 언어는 컬럼과 컬럼간의 연산 과 비교, 집계에 특화되어 있는 언어인데 반해 행과 행간의 관계를 정의하거나

비교, 연산 하는 것은 하나의 SQL 문으로 처리하기가 매우 번거롭다.

이러한 문제를 해결하기 위해 생겨난 것이 윈도우 함수이다.

 

Window Function 문법

SELECT WINDOW_FUNCTION(컬럼) OVER([PARTITION BY 컬럼] [ORDER BY 컬럼])
FROM 테이블;

OVER : OVER은 윈도우 함수에서 꼭 들어가야 하며 OVER 내부에 PARTITION BY 절과 ORDER BY 절이 들어간다.

PARTITION BY: 전체 집합을 어떤 기준컬럼에 따라 나눌지를 결정하는 부분.

ORDER BY: 어떤 컬럼을 기준으로 순위를 정할지 결정하는 부분

 

Window Function(윈도우 함수) 종류

  함수 -
순위함수 RANK, DENSE_RANK, ROW_NUMBER  
일반 집계 함수 SUM,MAX,MIN,AVG,COUNT SQL Server에서는 OVER절 내에서 
ORDER BY 지원하지 않음
그룹 내 행 순서 함수 FIRST_VALUE, LAST_VALUE,
LAG, LEAD
SQL Server에서는 지원하지 않음
그룹 내 비율 함수 RATIO_TO_REPORT,PERCENT_RANK,
CUME_DIST,NTILE
NTILE 제외
SQL Server에서는 지원하지 않음

 

GROUP BY(그룹화함수) 와 의 차이점 ?

  GROUP BY 윈도우 함수
기능 자르기 + 집약 자르기
특징 1. group by 에 지정된 컬럼 데이터를 자르고
2.집계 함수를 이용해 집약시킨다
1. Partition by 에 지정된 컬럼으로
데이터를 자른다.
차이점 행의 수가 줄어든다 행의 수가 그대로 유지된다

 

1. group by 

select address, count(*) 
from address 
group by 1;

이미지 출처 : https://schatz37.tistory.com/12

 

2. 윈도우 함수

select address , count(*) over(partition by address) 
from address;

이미지 출처 :  https://schatz37.tistory.com/12

group by 는 집약기능을 통해서 행의 수를 줄어들고, 반면에 윈도우 함수는 집약기능이 없기때문에 행수가 그대로 남아있다.

 

 

성능?

 

윈도우 함수는 복잡한 쿼리를 간단하게 작성할수 있다. 그렇다면 성능적인 측면은 ?

윈도우 함수에는 기본적으로 정렬(Sort)의 과정이 들어가있다. 그렇다면 성능적으로는 우수하지 않다! (일을 추가로 하니까!)

 

복잡한 쿼리를 줄이고 성능을 내기 위해서는 Join 과 서브쿼리를 적절히 사용해서 스캔해야 하는 행의 수를 줄여서 적절히

사용 한다면 더 높은 성능을 낼수 있다

 

'SQL' 카테고리의 다른 글

[SQL] Optimizer 옵티마이저 란 ?  (0) 2023.05.31
[Oracle] LAG, LEAD 함수  (0) 2023.05.30
[SQL] SQL WITH문  (0) 2023.04.20
[SQL] SQL UNION , UNION ALL  (0) 2023.04.18
[SQL] Query 실행 순서  (0) 2023.04.02