본문 바로가기

Algorithm/MySQL

[해커랭크(HackerRank)] Occupations (MySQL)

문제

  1. 행과 열을 바꾸는 pivot 활용
  2. 직업 아래에 이름이 표시되록 직업 열을 피벗 (Doctor, Prfessor, Singer, Actor 순으로)
  3. 이름은 알파벳 순으로 정렬

코드

#1. case문으로 확인하기 but 한줄만 출력됨

SELECT 
    MIN(CASE WHEN OCCUPATION = 'DOCTOR' THEN NAME ELSE NULL END) ,
    MIN(CASE WHEN OCCUPATION = 'PROFESSOR' THEN NAME ELSE NULL END) ,
    MIN(CASE WHEN OCCUPATION = 'SINGER' THEN NAME ELSE NULL END) ,
    MIN(CASE WHEN OCCUPATION = 'ACTOR' THEN NAME ELSE NULL END)
FROM OCCUPATIONS

#2. partition 만들기

occupation을 그룹핑해서 occupation, name, row_number()를 출력한다
그러면 각 직업 | 이름 | row_number 순으로 나옴

SELECT OCCUPATION, NAME, ROW_NUMBER() OVER (PARTITION BY OCCUPATION ORDER BY NAME)
FROM OCCUPATIONS

#3. 합치기

SELECT 
    MIN(CASE WHEN OCCUPATION = 'DOCTOR' THEN NAME ELSE NULL END) ,
    MIN(CASE WHEN OCCUPATION = 'PROFESSOR' THEN NAME ELSE NULL END) ,
    MIN(CASE WHEN OCCUPATION = 'SINGER' THEN NAME ELSE NULL END) ,
    MIN(CASE WHEN OCCUPATION = 'ACTOR' THEN NAME ELSE NULL END)
FROM (SELECT OCCUPATION, NAME, ROW_NUMBER() OVER (PARTITION BY OCCUPATION ORDER BY NAME) rn FROM OCCUPATIONS) as tmp
GROUP BY tmp.rn

2번을 묶어서 from절에 서브쿼리로 써준다
그리고 마지막에 partition으로 묶은 거를 꼭 그룹핑 해줘야한다 안그러면 또 한 줄만 출력됨

출처

 

ROW_NUMBER() OVER (PARTITION BY)

-- 기본적인 사용법
-- talbe의 데이터가 num의 오름차순이면서 순서대로 번호가 메겨져서 출력된다
SELECT ROW_NUMBER() OVER(order by num asc) as order_no
FROM table
  • row_number() over()를 사용하는 이유는 정렬과 더불어 rownum까지 주는 효과
함수(함수_적용_열) OVER (PARTITION BY 그룹열 ORDER BY 순서열)
  • partition by는 지정한 컬럼에서 동일한 데이터들끼리 묶어서 넘버링을 함

 

  1. 이해를 도운 감사한 글1
  2. 이해를 도운 감사한 글2
반응형