본문 바로가기

SQL/HackerRank (SQL문풀)

Advanced Select / Occupations / MySQL

728x90

📚문제

출처 : Hackerrank(https://www.hackerrank.com/challenges/occupations/problem?isFullScreen=true)

 

 

📌문제 설명

 

글씨체...

 

Name, Occupation 2가지 열로 이루어진 Occupations 테이블에서

Occupation 열을 pivot 시켜서 각 직업( 총 4가지 )별로 이름을 알파벳 순서대로 나열하면 됨 ( 빈 칸은 NUll 값으로 )

 

📝풀이

# Leaderboard의 정답 풀이
select  
    max(case when occupation = 'Doctor' then name end) 'Doctor',
    max(case when occupation = 'Professor' then name end) 'Professor',
    max(case when occupation = 'Singer' then name end) 'Singer',
    max(case when occupation = 'Actor' then name end) 'Actor'
from (
  select *, row_number() over (partition by occupation order by name) rn
  from occupations
) t
group by rn

 

몇 주 전까지 Hackerrank 문제 수월하게 풀어나가다가
이 문제에서 급 어려워져서 잠깐 멈췄었다
Leaderboard를 잠깐 확인해 보니 RANK,PARTITTION등의 고급 스킬이 필요한 것 같아서 
우선 제쳐두고 GA4 수강과 프로그래머스 , solvesql 문제풀이 등에 집중했었다

그리고 이제 프로그래머스와 solvesql 문제는 다 풀게 되서 다시 차근차근 풀어보기...

 

 + 아니... Leaderboard의 MySQL풀이를 따라하고 있었는데

   도저히 답처럼 나올것같지가 않아서  코드 그대로 복붙해서 한 번 제출해보니 오답이라고 뜸.....뭐지 

   그래서 다른 풀이로 대체 

 

✅Leaderboard의 풀이를 참고하여 1스텝씩 이해하면서 해보기

💡머릿속으로 이해가 잘 안되서 cmd창에 mysql을 실행시켜 문제 예시와 같이 테이블 생성

 

1. 윈도우 함수(row_number) 활용

SELECT *
     , ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) rn
FROM Occupations

 

✔️OVER (PARTITION BY...)

● 그룹 단위로 나누겠다

 

✔️ROW_NUMBER()

순서대로 번호 부여하는 윈도우 함수. 각 행에 대해 정수값 할당하며, 정렬 기준에 따라 증가

  

✔️PARTITON BY Occupation() / ORDER BY Name

row_number() 함수에 대한 파티션 지정. 각 직업(Occupation)에 대해서 이름(Name)의 알파벳 기준으로 순서 부여

 

✔️rn 

순위 나타내는 별칭. ROW_NUMBER()의 값이 여기 저장됨

 

 

 

2. rn으로 그룹화 후, 4가지 직업별 IF 문 생성 

SELECT MAX(IF(occupation = 'Doctor',name,NULL)) 'Doctor'
     , MAX(IF(occupation = 'Professor',name,NULL)) 'Professor'
     , MAX(IF(occupation = 'Singer',name,NULL)) 'Singer'
     , MAX(IF(occupation = 'Actor',name,NULL)) 'Acctor'
FROM (SELECT *, 
             row_number() over (partition by occupation order by name) rn
      FROM Occupations) t
GROUP BY rn

rn으로 그룹화 하면 각각 1,2,3으로 그룹화가 된다

여기서 숫자가 의미하는 바는 작아질수록 알파벳 앞쪽순서 ( 우선순위 )

따라서 

                  Doctor    Professor    Singer   Actor

rn = 1 =>    Jenny        Ashley     Meera   Jane

                                                  .

                                                  .

                                                  .

의 형태로 나오게 된다

 

💡MAX를 해주는 이유는 잘 모르겠지만 그룹화 하기 위해서..? 라고 생각하고 

   참고한 링크에서도 그렇게 얘기하시는 것 같다 🤔

 

진짜 어렵다..예제로만 보던 pivot과 너무 다르다

역시 실전은 훨씬 어렵구나

데이터리안 실전반을 수강해야하나 고민했는데 해야될...듯

 

 

 

참고링크 출처 : https://velog.io/@beemo/SQL-HackerRank-Occupations 

728x90