해커랭크 [Occupations]

윤태영·2024년 8월 26일
0

문제

https://www.hackerrank.com/challenges/occupations/problem?isFullScreen=true

  1. Occupation테이블의 Occupation(직업) 열을 피벗하여 각 이름이 알파벳순으로 정렬되어 해당 직업 아래에 표시되도록 합니다. 출력 열 헤더는 각각 의사, 교수, 가수 및 배우여야 합니다.
  2. Note: Print NULL when there are no more names corresponding to an occupation.

INPUT FORMAT

TABLE NAME : OCCUPATIONS

SAMPLE INPUT

SAMPLE OUTPUT

문제 풀이

1) 서브쿼리로 직업별로 이름을 알파벳 순으로 출력

  • ROW_NUMBER() 함수는 각 직업별로 이름을 알파벳 순서대로 정렬하고, 그 순서에 따라 번호를 매긴다.

  • PARTITION BY OCCUPATION은 직업별로 데이터를 그룹화합니다. 즉, 각 직업에 대해 독립적으로 순번을 매긴다.

2) MAX(CASE..)구문

  • MAX(CASE WHEN OCCUPATION = 'Doctor' THEN NAME END)는 MB로 그룹화된 각 그룹에서 OCCUPATION이 'Doctor'인 행의 이름을 가져온다.
  • 각 그룹에 대해 MAX()를 사용하면 해당 그룹 내에서 특정 조건을 만족하는 이름이 반환
    이 경우, MAX()는 특정 직업에 해당하는 이름을 반환하는데, 동일한 MB에 해당하는 이름이 하나밖에 없기 때문에, 사실상 조건을 만족하는 이름을 선택하는 역할을 한다.

3) MAX 함수를 사용한 이유는 GROUP BY때문에 (MIN함수를 사용해도 상관없다.)

쿼리

SELECT MAX(CASE WHEN OCCUPATION = 'Doctor' THEN NAME END),
              MAX(CASE WHEN OCCUPATION = 'Professor' THEN NAME END),
              MAX(CASE WHEN OCCUPATION = 'Singer' THEN NAME END),
              MAX(CASE WHEN OCCUPATION = 'Actor' THEN NAME END)
FROM(
              SELECT NAME, OCCUPATION,
              ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS MB
			  FROM OCCUPATIONS
) AS SUB
GROUP BY MB

profile
ice blue

0개의 댓글