STUDY_SEONMIN

HackerRank SQL - Occupations 본문

STUDY/SQL

HackerRank SQL - Occupations

Kululu_ 2021. 7. 20. 20:53

해커랭크에서 문제를 풀다가 피봇 테이블을 만드는 문제를 만났습니다.

위와 같은 테이블이 주어졌을 때 아래와 같은 결과를 만드는 문제였습니다.

 

아웃풋 결과를 보면 피봇 테이블의 컬럼은 각각 Doctor, Professor, Singer, Actor 입니다.


그렇다면 행 레이블은 무엇일까요??
해커랭크에서 문제를 읽어보면 이름은 알파벳 순서로 정렬이 되어야 한다고 나와있습니다. 이를 토대로 생각해본다면 행 레이블은 각 직업 내에서 해당 이름이 몇 번째 순서인지를 의미한다는 것을 알 수 있습니다.

 

직업별 이름 순서를 먼저 표현하기 위해서 ROW_NUMBER()를 사용해주었습니다.

 

SELECT NAME, OCCUPATION, ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS "RNUM"
FROM OCCUPATIONS;

쿼리를 실행하면 결과가 다음과 같이 나옵니다.

NAME OCCUPATION RNUM
Jane Actor 1
Julia Actor 2
Maria Actor 3
Jenny Doctor 1
Samantha Doctor 2
Ashley Professor 1
Christeen Professor 2
Ketty Professor 3
Meera Singer 1
Priya Singer 2

 

이 테이블을 피봇 테이블로 만드는 과정에서 행레이블이 RNUM이 되어야 하기 때문에 RNUM으로 GROUP BY를 해주어야 합니다.

 

그룹으로 묶어준 다음 원하는 결과물이 나오기 위해서 어떻게 해야되는지는 데이터를 살펴보면서 이야기하겠습니다.

 

RNUM = 1 인 데이터는 Jane Actor, Jenny Doctor, Ashley Professor, Meera Singer 가 있습니다.

최종 결과물의 첫 번째 컬럼인 'Doctor'컬럼을 살펴보겠습니다.

IF(OCCUPATION='Doctor', NAME, NULL) AS "Doctor"

이렇게 쿼리를 사용하게 되면 집계함수가 쓰이지 않았기에 오류가 나지만 어떤 데이터 집합일지 생각해보면 NULL, Jenny, NULL, NULL 과 같은 데이터 집합임을 알 수 있습니다.

 

NULL은 어떤 값보다도 크기 때문에 MIN() 집계함수를 사용하면 우리가 원하는 Jenny를 추출해낼 수 있습니다.

 

또한 RNUM=3의 경우 데이터가 Ketty Professor, Maria Actor 밖에 없으므로

IF(OCCUPATION='Doctor', NAME, NULL) AS "Doctor"

이 쿼리를 사용하게 되면 데이터 집합이 NULL, NULL이 됩니다. 이 중에서 NULL 하나만 뽑는 것도 역시 MIN() 집계함수를 사용하면 됩니다.

 

지금까지 생각한 내용들을 하나로 정리해 쿼리를 작성해보겠습니다.

SELECT
    MIN(IF(T.OCCUPATION='Doctor', NAME, NULL)) AS "Doctor",
    MIN(IF(T.OCCUPATION='Professor', NAME, NULL)) AS "Professor",
    MIN(IF(T.OCCUPATION='Singer', NAME, NULL)) AS "Singer",
    MIN(IF(T.OCCUPATION='Actor', NAME, NULL)) AS "Actor"
FROM(
     SELECT NAME, OCCUPATION, ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS "RNUM"
     FROM OCCUPATIONS) AS T
GROUP BY T.RNUM;

 

위 쿼리문을 사용해서 실제로 우리가 원했던 결과를 얻어 문제를 통과했습니다 :)

'STUDY > SQL' 카테고리의 다른 글

MEDIAN 찾기  (0) 2021.07.22
SQLD 시험 후기  (0) 2021.06.25
SELECT FROM tables  (0) 2021.04.19
SELF JOIN  (0) 2021.04.17
집계함수의 사용  (0) 2021.04.16
Comments