본문 바로가기
SQL 문제 풀기/2. SQLD 기출 : 2024.3.01~2024.4.25

<SQLD 50> NTILE 함수에 대한 기출문제

by HYEHYE_SON 2024. 4. 20.
728x90

매일 SQLD 기출 문제 풀기 챌린지


 


문제 50.

주어진 데이터에 대해서 아래의 SQL문을 수행하였을 때의 결과값이 아래의 결과와 같을때 (    )빈칸에 들어갈 값을 적으시오.

 

[TEST50]

CREATE TABLE TEST50(
COL1 VARCHAR(10),
COL2 VARCHAR(10),
COL3 NUMBER(10)
);


INSERT INTO TEST50 VALUES('A','가',10);
INSERT INTO TEST50 VALUES('A','가',20);
INSERT INTO TEST50 VALUES('A','다',25);
INSERT INTO TEST50 VALUES('B','가',10);
INSERT INTO TEST50 VALUES('B','나',30);
INSERT INTO TEST50 VALUES('B','나',20);
INSERT INTO TEST50 VALUES('B','나',60);
INSERT INTO TEST50 VALUES('C','라',30);

 

 

[SQL]

SELECT NTILE_2, COUNT(*) AS ROWCNT
FROM (
      SELECT COL1, COL2, COL3, NTILE(3) OVER(ORDER BY COL3) AS NTILE_2
      FROM TEST50
      )
GROUP BY NTILE_2;

 

 

[RESULT]

NTILE_2 ROWCNT
1 3
2 3
( ) ( )

 

답 :  _____

 


해설해보기

■ 데이터 분석 함수 NTILE
NTILE()은 데이터의 등급을 출력하는 함수입니다.

NTILE(숫자) => 괄호  안에 숫자를 입력하면, 그 수 만큼 등급을 나눈다는 것을 의미합니다.


여기서 중요한 것은 
나누고자 하는 등급의 수에 맞게 행의 수를 동일하게 분배한 후
남은 수는 높은 등급부터 낮은 등급에 차례로 분배한다는 점 입니다. 

 

문제의 인라인 뷰를 보면,

COL1, COL2, COL3을 출력하고,

NTILE(3)으로 등급을 3등급으로 나눠서 출력합니다.

 

이때, COL3 컬럼을 기준으로 ASC 하게 정렬한 후 등급을 나누고, 그 결과를 NTILE_2 라고 명명합니다.

 

등급은 8개의 행을 2개씩 분배한 뒤 

남은 2개를 높은 등급에 각 1씩 분배합니다.

 

따라서 1등급 3개, 2등급 3개, 3등급 2개가 출력된 것을 확인할 수 있습니다.

 

인라인 뷰 쿼리를 수행해보면, 아래와 같은 결과가 출력된다.

SELECT COL1, COL2, COL3, NTILE(3) OVER(ORDER BY COL3) AS NTILE_2
      FROM TEST50

 

 

메인쿼리는 인라인뷰에서 출력된 결과를 기반으로

NTILE_2 을 GROUP으로 묶어서 NTILE_2 별 건수를 출력하는 쿼리입니다. 

 

SELECT NTILE_2, COUNT(*) AS ROWCNT
    FROM (
      SELECT COL1, COL2, COL3, NTILE(3) OVER(ORDER BY COL3) AS NTILE_2
      FROM TEST50
      )
    GROUP BY NTILE_2;

 

따라서 정답은

3, 2 입니다.


관련 스크립트

CREATE TABLE TEST50(
COL1 VARCHAR2(10),
COL2 VARCHAR2(10),
COL3 NUMBER(10)
);


INSERT INTO TEST50 (COL1, COL2, COL3) VALUES ('A', '가', 10);
INSERT INTO TEST50 (COL1, COL2, COL3) VALUES ('A', '가', 20);
INSERT INTO TEST50 (COL1, COL2, COL3) VALUES ('A', '다', 25);
INSERT INTO TEST50 (COL1, COL2, COL3) VALUES ('B', '가', 10);
INSERT INTO TEST50 (COL1, COL2, COL3) VALUES ('B', '나', 30);
INSERT INTO TEST50 (COL1, COL2, COL3) VALUES ('B', '나', 20);
INSERT INTO TEST50 (COL1, COL2, COL3) VALUES ('B', '나', 60);
INSERT INTO TEST50 (COL1, COL2, COL3) VALUES ('C', '라', 30);
반응형