HackerRank/Occupations

Jimin·2022년 8월 24일
0

HackerRank

목록 보기
4/27


문제에서 요구하는 바에 의하면, 출력값이 다음과 같이 나와야 한다.

ORDER BY Docter DESC, Professor DESC, Singer DESC, Actor DESC

위와 같이 정렬하기 위해서는 직업별 이름 순으로 번호를 매겨 주어야 한다.
그렇기에 서브쿼리에서 row_number() OVER (PARTITION BY Occupation ORDER BY NAME) 를 이용하여 직업별로 번호를 매겨 주고, 순서를 정렬해준다.


Mysql

SELECT
MIN(CASE WHEN Occupation = 'Doctor' THEN Name END) 'Doctor',
MIN(CASE WHEN Occupation = 'Professor' THEN Name END) 'Professor',
MIN(CASE WHEN Occupation = 'Singer' THEN Name END) 'Singer',
MIN(CASE WHEN Occupation = 'Actor' THEN Name END) 'Actor'
FROM (
    SELECT *, row_number() OVER (PARTITION BY Occupation ORDER BY NAME) rn
    FROM OCCUPATIONS
) O
GROUP BY rn;
  • MySQL로 풀었다.
  • PIVOT의 형태로 표현하라고 한 문제였다.
  • SELECT문에서 MIN()을 사용한 이유?
    • 맨 마지막에 GROUP BY를 사용하기 위함이다. → 집계 함수가 필요하다.
      MAX()를 이용해도 상관 없다.
    • 값이 빌 경우 null 처리를 하기 위함이다.
  • OVER(PARTITION BY 기준) :
    • 기준에 따라 그룹 단위로 나누어 무언가를 해보겠다는 뜻이다.
    • 위 코드에서는 row_number를 name 순서대로 정렬된 occupation 별로 숫자를 매기겠다는 뜻이다.
  • 마지막에 GROUP BY rn을 빠뜨리면 한 줄만 출력되므로 꼭 써주어야 한다.

Oracle

PIVOT 함수 이용하기

SELECT Doctor, Professor, Singer, Actor
FROM (
    SELECT OCCUPATION, NAME, ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) RN
    FROM OCCUPATIONS
)
PIVOT(
    MIN(NAME) FOR Occupation IN (
        'Doctor' AS Doctor,
        'Professor' AS Professor,
        'Singer' AS Singer,
        'Actor' AS Actor
    )
)
ORDER BY 1, 2, 3, 4;
profile
https://github.com/Dingadung

0개의 댓글