홍동이의 성장일기
[HackerRank] Occupations 본문
💡 문제풀이
1. 직업별로(PARTITION BY occupation) 이름을 알파벳순으로(ORDER BY name) 순위를 매겨줍니다.
SELECT occupation
, name
, ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) as rn
FROM occupations
2. 피벗을 위해 CASE WHEN 구문을 사용합니다.
SELECT rn
, CASE WHEN occupation = 'doctor' THEN name END
, CASE WHEN occupation = 'professor' THEN name END
, CASE WHEN occupation = 'singer' THEN name END
, CASE WHEN occupation = 'actor' THEN name END
FROM (
SELECT occupation
, name
, ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) as rn
FROM occupations
) as t
rn이 1인 행을 살펴보면 다음과 같습니다.
WHERE rn = 1
3. NULL을 제외하고 이름만 나타내주기 위해서 rn을 기준으로 GROUP BY를 해줍니다. 이 때 SELECT 절의 집계는 아무것이나 사용해주어도 괜찮습니다.
SELECT MIN(CASE WHEN occupation = 'doctor' THEN name END)
, MIN(CASE WHEN occupation = 'professor' THEN name END)
, MIN(CASE WHEN occupation = 'singer' THEN name END)
, MIN(CASE WHEN occupation = 'actor' THEN name END)
FROM (
SELECT occupation
, name
, ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) as rn
FROM occupations
) as t
GROUP BY rn
ORDER BY rn
※ NULL로 시작하는 4번째 행을 살펴보면 doctor에 해당되는 name이 없습니다. 따라서 첫번째 열의 값이 NULL로 나옵니다.
📍본 내용은 '[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이'를 수강하며 작성한 내용입니다.
728x90
'Tool > SQL 코딩테스트 풀이' 카테고리의 다른 글
[Hacker Rank] Binary Tree Nodes / [LeetCode] 608. Tree Node (1) | 2023.10.12 |
---|---|
[HackerRank] Weather Observation Station 5 (0) | 2023.10.02 |
[HackerRank] New Companies (0) | 2023.09.30 |
[HackerRank] Contest Leaderboard (1) | 2023.09.16 |
[HackerRank] Weather Observation Station 17 (0) | 2023.09.16 |
Comments