250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 서브쿼리
- 데벨챌
- 약수구하기
- 프로그래머스문풀
- 그로스해킹
- 파이썬
- with절
- 활성사용자수
- SQL테스트
- mysql
- 데이터리안넥스트레벨챌린지
- 오블완
- levle1
- 윈도우함수
- 프로그래머스
- 코테준비
- 파이썬문풀
- leetcode문풀
- join
- 셀프조인
- leetcode
- SQL고득점KIT
- 티스토리챌린지
- 데이터리안실전반
- 데이터리안
- 위키독스
- sql50
- 문풀
- SQL
- sql문풀
Archives
- Today
- Total
꿈은 데이터분석가, 취미는 계획
[해커랭크: SQL] SQL로 피봇하기 본문
728x90
출처[해커랭] : Occupations
문제: occupation컬럼과 name컬럼을 사용하여, 직업별 컬럼을 생성하고 이름 순으로 조회
ROW_NUMBER + PARTITION BY 활용
STEP 1
occupation별로 name의 알파벳순으로 순위부여
*ROW_NUMBER를 사용해야 동일 직업-동일 이름이더라도 다른 순위를 부여한다
SELECT occupation,
name,
ROW_NUMBER() OVER(PARTITION BY occupation ORDER BY name) AS num
FROM occupations
STEP 2
1) 직업별 순위를 부여한 쿼리를 서브쿼리로 FROM 절에서 사용
*서브쿼리에 별칭을 반드시 지정해야 함.
2) CASE문을 사용하여 직업(occupation)별 컬럼을 생성하고, 해당 순위에 해당하는 이름을 표시
*특정 직업에 해당하는 값이 없을 경우 NULL로 출력.
3) GROUP BY를 사용하여 동일한 순위(num)를 가진 행을 그룹화
*CASE 문을 사용하여 직업별로 나눈 값을 MIN()으로 감싸서 그룹 내 최소값을 가져옴.
4) ORDER BY num을 사용하여 순위(num) 기준으로 오름차순 정렬
SELECT
MIN(CASE WHEN occupation = 'Doctor' THEN name ELSE NULL END) AS Doctor,
MIN(CASE WHEN occupation = 'Professor' THEN name ELSE NULL END) AS Professor,
MIN(CASE WHEN occupation = 'Singer' THEN name ELSE NULL END) AS Singer,
MIN(CASE WHEN occupation = 'Actor' THEN name ELSE NULL END) AS Actor
FROM(SELECT occupation,
name,
ROW_NUMBER() OVER(PARTITION BY occupation ORDER BY name) AS num
FROM occupations) n
GROUP BY num
ORDER BY num
728x90
'SQL > SQL문풀' 카테고리의 다른 글
[데이터리안] SQL로 리텐션 구하는 방법(클래식, 롤링 리텐션) (0) | 2025.02.08 |
---|---|
[Leetcode:SQL] 부서별로 top3 급여 조회하기 (0) | 2025.02.08 |
[프로그래머스: SQL 고득점 kit] 서울 매장의 리뷰 평균 구하기 (0) | 2025.02.06 |
[MY SQL] 영화를 가장 많이 본 사람과 평점이 가장 높은 영화 찾기 (0) | 2025.02.05 |
[MY SQL] id의 순서 변경하기 (0) | 2025.02.04 |