윈도우 함수
윈도우함수 개요
- 행과 행간의 관계를 쉽게 정의하기 위해 만든 함수가 WINDOW FUNCTION
- 종류
- 순위(RANK) 관련 함수 : RANK, DENSE_RANK, ROW_NUMBER
- 집계(AGGREGATE) 관련 함수 : SUM, MAX, COUNT 등
- 그룹 내 행 순서 관련 함수 : FIRST_VALUE, LAST_VALUE, LAG, LEAD
- 그룹 내 비율 관련 함수 : CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT
- 선형 분석을 포함한 통계분석 함수 : CORR, COVAR_POP, STDDEV 등
- WINDOW FUCNTION SYNTAX
- 윈도우 함수에는 OVER 문구가 키워드로 필수 포함된다.
SELECT WINDOW_FUNCTION (...) OVER ([PARTITION BY] [ORDER BY] [WINDOWING])
FROM TABLE_NAME
- PARTITION BY : 전체 집합을 기준에 의해 소그룹으로 나눌 수 있다.
- ORDER BY : 어떤 항목에 대해 순위를 지정할지 ORDER BY 절을 기술한다.
- WINDOWING : 함수의 대상이 되는 행 기준의 범위를 강력하게 지정할 수 있다. / SQL SERVER는 미지원
그룹 내 순위함수
RANK함수
- 특정 컬럼에 대한 순위를 구하는 함수다.
- 이 때 , PARTITION 내에서 순위를 구할수도 있고, 전체 데이터에 대한 순위를 구할수도 있다.
- 동일한 값에 대해서는 동일한 순위를 부여한다.
- 중복 순위 갯수만큼 다음 순위 값을 증가시킨다.
- EX. 1, 2, 2, 4 ...
- p.326
SELECT RANK () OVER (ORDER BY COL1 DESC) AS ALL_RANK
, RANK () OVER (PARTITION BY COL2 ORDER BY COL1 DESC) AS COL2_RANK
FROM TBL
DENSE_RANK 함수
- RANK와 유사하나, 동일한 순위를 하나의 건수로 취급한다.
- 동일한 순위를
- 중복 순위가 존재해도 순차적으로 다음 순위값을 표시한다.
- EX. 1, 2, 2, 3 ...
SELECT DENSE_RANK () OVER (ORDER BY COL1 DESC) AS ALL_RANK
FROM TBL
ROW_NUMBER
- 동이로한 값이라도 고유한 순위를 부여한다.
- 동일한 값에 대한 순서를 관리하고 싶다면, ORDER BY 절을 적절히 활용해라.
SELECT ROW_NUMBER () OVER (ORDER BY COL1 DESC) AS ALL_RANK
FROM TBL
일반 집계함수
SUM 함수
- PARTITION 별 윈도우의 합을 구할 수 있다.
- p.331
SELECT SUM (COST) OVER (PARTITION BY COL1) AS SUM
FROM TBL
+ MAX(), MIN(), AVG(), COUNT()
++ RANGE
그룹 내 행 순서 함수
FIRST_VALUE
- 파티션별 윈도우에서 가장 먼저 나온 값을 구하는 함수
- SQL Server에서는 지원하지 않는다.
- MIN 함수를 활용해 같은 결과를 얻을 수 있다.
- 공동 등수를 인정하지 않고, 처음 나온 행만 처리한다.
의도적으로 세부 항목을 정렬하고 싶다면, OVER() 내의 ORDER BY 절에 컬럼을 추가하거나 별도의 정렬 조건을 가진 INLINE VIEW를 사용해야 한다.
+ LAST_VALUE (MAX)
LAG
- 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져오는 함수
- SQL Server에서는 지원하지 않는다.
-- 하나 앞의 행
SELECT ...
, LAG (COL1) OVER (ORDER BY ...) AS COL1
FROM TBL1
-- N번째 앞의 행, 없을경우 NULL 대신 0
SELECT ...
, LAG (COL1, N, 0) OVER (ORDER BY ...) AS COL1
FROM TBL1
LEAD
- 파티션별 윈도우에서 이후 몇 번재 행의 값을 가져오는 함수
- SQL Server에서는 지원하지 않는다.
-- N번째 이후의 행 (DEFAULT 1), 없으면 NULL 대신 0
SELECT ...
, LEAD (COL1, N, 0) OVER (ORDER BY ...) AS COL1
FROM TBL1
그룹 내 비율함수
RATIO_TO_REPORT
- 파티션 내 전체 SUM() 값에 대한 행별 컬럼 값의 백분율을 소수점으로 구하는 함수
- 0 < 결과값 <= 1
- 개별 RATIO의 합을 구하면 1
SELECT ...
, ROUND (RATIO_TO_REPORT (COL1) OVER (), 2) AS COL1
FROM TBL1
PERCENT_RANK
- 파티션별 윈도우에서 제일 먼저 나오는 것을 0, 제일 늦게 나오는 것을 1로 해, 값이 아닌 행의 순서별 백분율을 구하는 함수
- 0 <= 결과값 <= 1
- SQL Server는 지원하지 않는다.
CUME_DIST
- 파티션별 윈도우의 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적백분율을 구하는 함수
- 0 < 결과값 <= 1
- SQL Server는 지원하지 않는다.
NTILE
- 파티션별 전체 건수를 ARGUMENT 값으로 N등분한 결과를 구하는 함수
- 전체 파티션 행 갯수를 NTILE(N)의 N개의 그룹으로 분할한다는 소리다.
M개의 사람을 N개의 조로 나눈다고 생각ㄱ
TOP N 쿼리
ROWNUM PSEUDO COLUMN
- ORACLE의 ROWNUM 은 컬럼과 비슷한 성격의 Pseudo Column
- SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호
- 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때, WHERE 절에서 행 개수 제한하는 목적으로 사용
- ORACLE의 경우 데이터가 일부 추출된 후, 정렬작업이 일어나므로 주의해야 한다.
SELECT ...
FROM TBL_A
WHERE ROWNUM < 5
TOP 절
- SQL Server는 TOP절을 사용해 결과 집합으로 출력되는 행의 수를 제한할 수 있다.
TOP (Expression) [PERCENT] [WITH TIES]
SELECT TOP(5)
, COL_A
, COL_B
...
FROM TBL_A
- Expression : 반환할 행 수를 지정하는 숫자
- PERCENT : 쿼리 결과 집합에서 처음 Expression%의 행만 반환됨
- WITH TIES : ORDER BY 절이 지정된 경우만 사용 가능, TOP N(PERCENT)의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정 가능
ROW LIMITING 절
- ANSI 표준 SQL 문법
[OFFSET offset {ROW | ROWS}]
[FETCH {FIRST | NEXT} [{rowcount | percent PERCENT}] {ROW | ROWS} {ONLY | WITH TIES}]
SELECT ...
FROM TBL_A
ORDER BY COL1, ...
FETCH FIRST 5 ROWS ONLY
SELECT ...
FROM TBL_B
ORDER BY COL1, ...
OFFSET 5 ROWS
- OFFSET : 건너뛸 행의 개수를 지정한다.
- FETCH : 반환할 행의 개수나 백분율을 지정한다.
- ONLY : 지정된 행의 개수나 백분율 만큼 행을 반환한다.
- WITH TIES : 마지막 행에 대한 동순위를 포함해 반환한다.
계층형 질의와 셀프조인
계층형 데이터
- 동일 테이블에 계층적으러 상위와 하위 데이터가 포함된 데이터
- ex) 사원, 조직, 메뉴
- 엔터티를 순환관계 데이터 모델로 설계할 경우 계층형 데이터가 발생
- 순환관계 데이터모델은 셀프 조인이나 계층형 질의로 조회할 수 있다.
셀프조인
- 동일 테이블 사이의 조인
- 테이블명, 컬럼 명이 모두 동일하므로, 식별을 위해 반드시 Alias를 사용해야 한다.
- 순방향전개
- 역방향전개
계층형 질의
- Oracle
SELECT ...
FROM TALBE1
...
START WITH condition
AND condition
CONNECT BY [NOCYCLE] condition
AND condition
[ORDER SIBLINGS BY column, ...]
- START WITH : 계층구조 전개의 시작 위치를 지정하는 구문
- CONNECT BY : 다음에 전개될 자식 데이터를 지정하는 구문
- PRIOR : CONNECT BY 절에 사용되면, 현재 읽은 컬럼을 지정
- NOCYCLE
- 데이터를 전개하며 이미 나타났던 동일한 데이터가 전개중에 다시 나타나면, 이것을 가리켜 사이클이라고 한다.
- 사이클이 발생한 데이터는 런타임 오류가 발생한다.
- NOCYCLE을 추가하면 오류를 발생시키지 않고, 사이클이 발생한 이후의 데이터를 전개하지 않는다.
'학교 > SQLD' 카테고리의 다른 글
[SQLD] 2.2.1~3 SQL 활용 (0) | 2024.12.23 |
---|---|
[SQLD] 2.1 SQL 기본 (1) | 2024.12.19 |
[SQLD] 1.2.2 조인 / 1.2.3 모델이 표현하는 트랜잭션의 이해 / 1.2.4 Null 속성의 이해 / 1.2.5 본질식별자 vs. 인조식별자 (0) | 2024.12.19 |
[SQLD] 1.2.1 정규화 (3) | 2024.12.18 |
[SQLD] 1.1.4. 관계 / 1.1.5. 식별자 (0) | 2022.03.09 |