반응형

    윈도우 함수

    1) 의미 : 서로 다른 행의 비교나 연산을 위해 만든 함수

    2) 특징 : group by를 쓰지 않고 연산 가능

    3) 종류 : LAG, LEAD, SUM, AVG, MIN, MAX, COUNT, RANK

     

    rank over는 대상이 안 나와도 됨

    문법

    1) partition by : 연산할 그룹을 묶는 것

    2) order by 정렬 순서

    3) rows, range, between 범위 설정에 따라 누적합의 결과가 달라짐

    연산 범위를 쓰려면 꼭 정렬인 ORDER BY 절을 사용해야 함

    순서를 꼭 맞춰야 함

     

    예시)

    over절을 사용하여 윈도우 함수로 사용 가능

     

    공통 범위 설정

    - 범위 설정을 한다면, ORDER BY 절 필수로 써야 함

    1. ROWS : 정렬을 할 때 값이 같더라도 각 행씩 연산
    2. RANGE : 같은 값의 경우 하나의 RANGE로 묶어서 동시 연산 (DEFAULT)
    3. BETWEEN A AND B
      1. 시작점
        1. current row : 현재 행부터
        2. unbounded preceding : 처음부터(default)
        3. N preceding : n 이전부터
      2. 마지막 시점
        1. current row : 현재 행까지
        2. unbounded following : 마지막까지
        3. n following : n 이후까지

     

    순위 관련 함수

    - ORDER BY 절 필수

    1. RANK WITHIN GROUP
      1. 특정값에 대한 순위 확인
    2. RANK() OVER()
      1. 전체 중이나 특정 그룹 중 값의 순위 확인
      2. 그룹 내에 순위를 구할 땐 PARTITION BY 절 사용
      3. 동순위가 있을 경우, 그 다음 순위가 결정이 됨
    3. DENSE_RANK() OVER()
      1. 누적 순위로, 값이 같을 때 동일한 순위 부여우 다음 순위가 바로 이어짐
      2. ex) 1등이 5명이더라도 다음 순위는 2등이 됨
    4. ROW_NUMBER() OVER()
      1. 연속된 행 번호
      2. 동일한 순위는 없고 단순히 순서대로 나열한대로의 순서 값 리턴

     

    LAG, LEAD

    - 행 순서대로 각각 이전 값(LAG), 이후 값(LEAD) 가져오기

    - ORDER BY 절 필수

    - 보통 한 행과 다른 한 행의 정보를 같이 출력할 수 없음 그걸 해결하기 위한 함수

    SELECT LAG(컬럼, [N])
    	OVER ([PARTITION BY 컬럼]
        	   ORDER BY 컬럼 [ASC|DESC]);
    • 가져올 컬럼명 입력
    • 몇 번째 값 가져올지 적는데 생략 시 default는 1
    • partition by는 생략 가능하지만, order by는 필수

     

    FIRST_VALUE, LAST_VALUE

    - 정렬 순서대로 정해진 범위에서의 처음 값, 마지막 값 출력

    - 순서와 범위 정의에 따라 최솟값과 최댓값 리턴 가능

    - PARTITION BY, ORDER BY 절 생략 가능

    1. LAST_VALUE
      1. 기본적으로 처음부터 현재 행까지의 마지막 값을 의미 그래서 범위 설정을 안하면 항상 자기 자신을 리턴
      2. 원하는 값을 설정하려면 처음부터 마지막까지의 범위 설정이 필요함 
        between unbounded preceding and unbounded following

     

    NTILE

    - 행을 특정 컬럼 순서에 따라 정해진 수의 그룹으로 나누기 위한 함수

    - 그룹 번호가 리턴되며, ORDER BY절 필수

    - PARTITION BY를 사용하여 특정 그룹을 원하는 수만큼 분리가 가능함

    - 총 행의 수가 명확히 나누어지지 않을 경우, 앞 그룹의 크기가 더 크게 분리됨

       ex) 14명 3개 그룹 분리 : 5, 5, 2로 나뉨

    SELECT NTILE(N)
    	OVER ([PARTITION BY 컬럼]
        	   ORDER BY 컬럼 [ASC|DESC]);
    • N자리에 나눌 그룹의 수를 적어주면 됨

     

    비율관련 함수

    1. RATIO_TO_REPORT
      1. 각 값의 비율을 리턴 (전체 또는 특정 그룹 내 비율 가능)
      2. ORDER BY 사용 불가
    2. CUME_DIST
      1. 각 행의 수에 대한 누적 비율
      2. 특정 값이 전체 데이터 집합에서 차지하는 위치를 백분위수로 계산하여 출력
      3. ORDER BY 필수이며 누적 비율 구하는 순서를 정할 수 있음
    3. PERCENT_RANK
      1. 행의 위치를 분위수를 출력
      2. 전체 COUNT 중 상대적 위치를 출력(0 첫번째 행~1 마지막 행 범위 내)
      3. ORDER BY 필수

     

    TOP N QUERY

    - 페이징 처리를 효과적으로 수행하기 위해 사용

    - 전체 결과에서 특정 N개 추출

    1. ROWNUM
      1. 출력된 데이터 기준으로 행 번호 부여
      2. = 연산 불가
      3. 시작값이 정의되어야 다음 행번호를 추출할 수 있음
    2. RANK
    3. FETCH
      1. 출력될 행의 수를 제한하는 절
      2. ORDER BY 절 뒤에 사용
      3. 문법
        OFFSET N:  필수는 아님, 건너뛸 행의 수
        FETCH : 출력할 행의 수를 전달 (first or next를 선택해야 함)
        FIRST : OFFSET을 쓰지 않았을 때 처음부터 N행 출력 명령
        NEXT : OFFSET을 사용했을 경우 제외한 행 다음부터 N행 출력 명령
        ROWS ONLY로 마무리
    4. TOP N(SQL Server)
      1. 상위 n개 행 추출
      2. 서브쿼리 사용없이 하나의 쿼리로 정렬된 순서대로 상위 n개 출력 가능
      3. WITH TIES를 사용하여 동순위까지 함께 출력 가능

     

    계층형 질의

    - 하나의 테이블 내 각 행끼리 관계를 가질 때, 연결 고리를 통해 행과 행 사이의 계층(depth)을 표현하는 기법

    - PRIOR의 위치에 따라 연결하는 데이터가 달라짐

    1. 문법
      1. START WITH : 데이터를 출력할 시작조건
      2. CONNECT BY PRIOR : 행을 이어나갈 조건
        - CONNECT BY에 전달하는 조건은 시작 조건이 아닌 추가적인 연결 조건임
      3. NOCYCLE : 순환이 발생하면 푸한 루프가 될 수 있기 때문에 이를 방지하고자 사용
    2. 가상 컬럼
      1. LEVEL : 각 DEPTH를 표현 (시작점이 1레벨)
      2. CONNECT_BY_ISLEAF : LEAF NODE(최하위노드) 여부 (참 1, 거짓 0)
    3. 가상 함수
      1. CONNECT_BY_ROOT 컬럼명 : 루트 노드의 해당하는 컬럼값
      2. SYS_CONNECT_BY_PATH(컬럼, 구분자) : 이어지는 경로 출력
      3. ORDER SIBLINGS BY 컬럼 : 같은 LEVEL일 경우 원하는 컬럼으로 정렬 수행
      4. CONNECT_BY_ISCYCLE : 계층형 쿼리의 결과에서 순환이 발생했는지 여부

     

    데이터 구조 변경

    1. PIVOT : 교차표를 만드는 기능 LONG -> WIDE

    SELECT *
    FROM 테이블명 또는 서브쿼리
    	PIVOT (VALUES컬럼명 FOR UNSTACK컬럼명 IN (VAR1, VAR2, VAR3))
    • 반드시 FROM절에 STACK, UNSTACK, VALUE 모두 명시
    • FROM 절에 선언된 컬럼 중 UNSTACK과 VALUE 컬럼 제외하고 모두 STACK 컬럼으로 사용함
    • STACK 컬럼 : 왼쪽에 고정할 컬럼
    • UNSTACK 컬럼 : 펼칠 컬럼
    • VALUE 컬럼 : 값 전달

    2. UNPIVOT : WIDE -> LONG

    SELECT *
    FROM 테이블명 또는 서브쿼리
    	UNPIVOT (VALUES컬럼명 FOR STACK컬럼명 IN (VAR1, VAR2, VAR3))
    • STACK 컬럼 : 이미 UNSTACK 되어있는 여러 컬럼을 하나의 컬럼으로 STACK시 새로 만들 컬러이름 정의
    • VALUE 컬럼 : 교차표에서 셀 자리의 값을 하나의 컬럼으로 표현하고자 할 때 새로 만들 컬럼명 정의

     

     

    정규 표현식

    문법

    - 대상, 찾을 문자열, [바꿀 문자열], [검색위치], [발견횟수], [옵션]

     

    반응형

    댓글