반응형

/*
-- Title : [SQL2017] 누적분포(Cumulative Distribution) 구하기 - CUME_DIST()
-- Reference : docs.microsoft.com
*/


■ CUME_DIST()

  • 주어진 그룹에서의 '상대적인 누적분포'를 계산
  • 전체를 한 줄로 나열했을 때 '0에서 1사이의 값'으로 표현
  • 쉽게 말해 그룹 내에서 '상대적 위치를 계산'


■ 데이터 셋 만들기

ㅁ 스크립트

-------------------------------------------------
-- 데이터 생성
-------------------------------------------------
DROP TABLE #ttt;

CREATE TABLE #ttt
( akey VARCHAR(10)
, ksic VARCHAR(10)
);

INSERT INTO #ttt
VALUES ('KR01', 'C111')
     , ('KR02', 'C222')
     , ('KR03', 'C333')
     , ('KR04', 'C333')
     , ('KR05', 'C333')
     , ('KR06', 'C444')
     , ('KR07', 'C555')
     , ('KR08', 'C666')
     , ('KR09', 'C666')
     , ('KR10', 'C666')
     , ('KR11', 'C666')
     , ('KR12', 'C777')
     , ('KR13', 'C777');

-------------------------------------------------
-- 데이터 조회
-------------------------------------------------
--▶ 기본 조회
SELECT row_number() OVER(ORDER BY akey) "no"
     , akey, ksic
FROM #ttt;

 


ㅁ 결과셋


■ 1. akey 정렬을 통한 누적분포 구하기

ㅁ 스크립트

SELECT row_number() OVER(ORDER BY akey) "no"
     , akey, ksic
     , CUME_DIST() OVER (ORDER BY akey) "cume_akey"
FROM #ttt;

ㅁ 결과셋

ㅁ 해석

  • 정렬기준인 akey는 중복이 없기에 13개 행이 일렬로 나열됨
  • 각 akey가 1/13의 비율을 가짐
  • 각 비율을 누적하여 계산
  • 각 akey가 상대적으로 위치하는 % 확인 가능

2. ksic 정렬을 통한 누적분포 구하기

ㅁ 스크립트

SELECT *
     , CUME_DIST() OVER (ORDER BY ksic건수, ksic) "cume_ksic"  
FROM
(
    SELECT row_number() OVER(ORDER BY ksic) "no"
         , akey, ksic
         , COUNT(*) OVER (PARTITION BY ksic) "ksic건수"
    FROM #ttt
) a
ORDER BY ksic건수, ksic;

 

ㅁ 결과셋

ㅁ 계산과정

  1. ksic의 그룹별 건수 계산하고 정렬
  2. ksic의 전체건수(=ksic 그룹별 건수의 합) 계산
  3. 1번의 그룹별 건수를 2번의 전체건수로 나눠 비율 계산
  4. 계산된 비율을 정렬순대로 누적(=Cume_Dist)

ㅁ 해석

  • 60% 이상의 KSIC가 KR03, KR05, KR08, KR09, KR10, KR11 6개가 포함됨을 확인

3. ksic 정렬을 통한 누적분포 - 단, ksic건수가 2 이상인 것만

ㅁ 스크립트

SELECT *
     , CUME_DIST() OVER (ORDER BY ksic건수, ksic) "cume_ksic"  
FROM 
(
    SELECT row_number() OVER(ORDER BY ksic) "no"
         , akey, ksic
         , COUNT(*) OVER (PARTITION BY ksic) "ksic건수"
    FROM #ttt 
) a
WHERE ksic건수 > 1
ORDER BY ksic건수, ksic;

ㅁ 결과셋

ㅁ 계산과정

  1. ksic의 그룹별 건수 계산하고 정렬
  2. ksic의 전체건수(=ksic 그룹별 건수의 합) 계산
  3. 1번의 그룹별 건수를 2번의 전체건수로 나눠 비율 계산
  4. 계산된 비율을 정렬순서대로 누적(=Cume_Dist)

ㅁ 해석

  • 60% 이상의 KSIC가 KR09, KR10, KR11 3개가 포함됨을 확인

결국, Cume_Dist() 함수는 전체를 일렬로 나열해서 각 그룹이 상대적으로 어디에 위치하는지를 나타낸다. 또한, CUME_DIST()의 ORDER BY 대상이 PK로 누적되어 나열된다고 생각하면 된다.

cume_dist 구현_20210227.xlsx
0.02MB

 

 

반응형

+ Recent posts