문제
- 행과 열을 바꾸는 pivot 활용
- 직업 아래에 이름이 표시되록 직업 열을 피벗 (Doctor, Prfessor, Singer, Actor 순으로)
- 이름은 알파벳 순으로 정렬
코드
#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는 지정한 컬럼에서 동일한 데이터들끼리 묶어서 넘버링을 함
반응형
'Algorithm > MySQL' 카테고리의 다른 글
[해커랭크(HackerRank)] New Companies (MySQL) (0) | 2021.07.09 |
---|---|
[해커랭크(HackerRank)] Binary Tree Nodes (MySQL) (0) | 2021.07.08 |
[LeetCode] 196. Delete Duplicate Emails (MySQL) (0) | 2021.07.08 |
[LeetCode] 627. Swap Salary (MySQL) (0) | 2021.07.08 |
[해커랭크(HackerRank)] The PADS (MySQL) (0) | 2021.07.07 |