[코딩테스트]/[SQL]

[StrataScratch - SQL] (Medium) Activity Rank

잰잰' 2025. 5. 5. 13:12

문제

각 사용자의 이메일 활동 순위를 구하십시오. 이메일 활동 순위는 보낸 이메일의 총 수로 정의됩니다. 가장 많은 이메일을 보낸 사용자는 순위 1을 가지며, 그 다음 사용자는 순위 2를 가집니다. 사용자, 총 이메일 수, 그리고 그들의 활동 순위를 출력하십시오.

• 기록은 총 이메일 수를 기준으로 내림차순으로 먼저 정렬하십시오.
• 이메일 수가 같은 사용자는 사용자 이름을 기준으로 알파벳 순으로 정렬하십시오.
• 순위에는 이메일 수가 같은 경우에도 고유한 값을 반환하십시오 (즉, 고유한 순위).

 

테이블설명

 

예상결과

 

✏️ 풀이

SELECT from_user, COUNT(*) AS total_emails,
    ROW_NUMBER() OVER(ORDER BY COUNT(*) DESC, from_user ASC)
FROM google_gmail_emails
GROUP BY 1
ORDER BY 2 DESC, 1 ASC;

1. 유저별 COUNT

2. 이메일 수, 사용자 이름 순으로 정렬

3. ROW_NUMBER()를 이용한 순번 지정

 

📚 개념정리

ROW_NUMBER() : MySQL에서 제공하는 윈도우 함수 중 하나로 결과 집합 내에서 각 행에 고유한 순번을 부여

순번은 기본적으로 결과 집합의 순서에 따라 할당

# 기본 사용법 #
SELECT 
    column1,
    column2,
    ROW_NUMBER() OVER (ORDER BY column1) AS row_num
FROM 
    your_table;

 

  • 고유한 순번: ROW_NUMBER()는 각 행에 대해 고유한 순번을 반환. 동일한 값을 가진 행이라도 각 행에 대해 별도의 순번이 부여.
  • OVER 절: ROW_NUMBER()는 반드시 OVER() 절과 함께 사용해야 하며, 이 절 내에서 결과 집합의 순서를 정의하는 ORDER BY 조건 지정 가능.
  • 윈도우 함수: ROW_NUMBER()는 일반적인 GROUP BY와는 달리 집합 내 각 행에 대한 정보를 동시에 제공하므로, 그룹화 없이 개별 행을 다룰 수 있다.