[프로그래머스/MySQL/GROUP BY/LV.1] 상위 n개 레코드

sammy·2024년 8월 4일
0

SQL 문제풀이

목록 보기
57/84

문제

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

예시

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A399552 Dog 2013-10-14 15:38:00 Normal Jack Neutered Male
A379998 Dog 2013-10-23 11:42:00 Normal Disciple Intact Male
A370852 Dog 2013-11-03 15:04:00 Normal Katie Spayed Female
A403564 Dog 2013-11-18 17:03:00 Normal Anna Spayed Female

이 중 가장 보호소에 먼저 들어온 동물은 Jack입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

NAME
Jack

※ 보호소에 가장 먼저 들어온 동물은 한 마리인 경우만 테스트 케이스로 주어집니다.


본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges


✔️  문제접근

DATETIME의 최댓값을 구해야 하므로, DATETIME 기준 오름차순 정렬 후 LIMIT 1 연산을 한다.

⭐️   내 정답

SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;

🔎 짚고 넘어가기

RANK() 함수

RANK() 함수는 데이터 내에서 행의 순위를 계산하는 데 사용됩니다. 이 함수는 동일한 값에 대해 동일한 순위를 부여하며, 그 다음 순위는 건너뜁니다(즉, 동일 순위 다음에 2위가 두 개 있으면 다음 순위는 4위가 됩니다). RANK() 함수는 일반적으로 ORDER BY와 함께 PARTITION BY 절을 사용하여 특정 기준에 따라 데이터를 그룹화하고 정렬하여 순위를 매깁니다.

RANK() 함수 사용법

기본 문법

SELECT column1, column2, ..., 
       RANK() OVER (
           PARTITION BY column_name1 
           ORDER BY column_name2
       ) AS rank_column_name
FROM table_name;
  • PARTITION BY: 데이터를 그룹화할 열을 지정합니다. 이 절을 사용하지 않으면 전체 결과 집합에 대해 순위가 매겨집니다.
  • ORDER BY: 순위를 결정할 기준이 되는 열을 지정합니다. 정렬 기준에 따라 순위가 결정됩니다.

예제

1. 전체 데이터에 대한 순위 계산

아래 예제에서는 직원들의 급여에 따라 전체 데이터를 순위로 매깁니다.

SELECT employee_id, employee_name, salary,
       RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;

이 예제에서는 직원들의 급여를 기준으로 내림차순으로 정렬하고, 그에 따라 순위를 매깁니다.

2. 그룹별 순위 계산

부서별로 직원의 급여 순위를 매기는 예제입니다.

SELECT department_id, employee_id, employee_name, salary,
       RANK() OVER (
           PARTITION BY department_id 
           ORDER BY salary DESC
       ) AS department_salary_rank
FROM employees;

여기서는 PARTITION BY 절을 사용하여 department_id별로 데이터를 그룹화하고, 각 부서 내에서 급여 순위를 매깁니다.

3. 동일한 값에 대한 순위 처리

RANK() 함수는 동일한 값이 있을 때 같은 순위를 부여합니다. 예를 들어, 동일한 급여를 받는 두 직원이 있을 경우, 두 직원 모두 같은 순위를 부여받고, 그 다음 순위는 건너뜁니다.

SELECT employee_id, employee_name, salary,
       RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
  • RANK() 함수는 동일한 값에 대해 같은 순위를 부여하고 그 다음 순위를 건너뜁니다. 예를 들어, 두 번째 순위가 두 개 있으면 그 다음 순위는 네 번째 순위가 됩니다.
  • 동일한 순위의 다음 순위를 건너뛰지 않으려면 DENSE_RANK() 함수를 사용할 수 있습니다.

DENSE_RANK() 함수

DENSE_RANK() 함수는 RANK() 함수와 유사하게 행의 순위를 매기는 데 사용되지만, 동일한 순위를 가진 값이 있을 때 그 다음 순위를 건너뛰지 않는다는 점에서 차이가 있습니다. 이 함수는 데이터 내에서 중복 없이 연속적인 순위를 생성합니다.

DENSE_RANK() 함수 사용법

기본 문법

SELECT column1, column2, ..., 
       DENSE_RANK() OVER (
           PARTITION BY column_name1 
           ORDER BY column_name2
       ) AS rank_column_name
FROM table_name;
  • PARTITION BY: 데이터를 그룹화할 열을 지정합니다. 이 절을 사용하지 않으면 전체 결과 집합에 대해 순위가 매겨집니다.
  • ORDER BY: 순위를 결정할 기준이 되는 열을 지정합니다. 정렬 기준에 따라 순위가 결정됩니다.

예제

1. 전체 데이터에 대한 순위 계산

아래 예제에서는 직원들의 급여에 따라 전체 데이터를 순위로 매깁니다.

SELECT employee_id, employee_name, salary,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;

이 예제에서는 직원들의 급여를 기준으로 내림차순으로 정렬하고, DENSE_RANK()를 사용하여 순위를 매깁니다. 동일한 급여를 받는 직원들이 있더라도 다음 순위는 건너뛰지 않습니다.

2. 그룹별 순위 계산

부서별로 직원의 급여 순위를 매기는 예제입니다.

SELECT department_id, employee_id, employee_name, salary,
       DENSE_RANK() OVER (
           PARTITION BY department_id 
           ORDER BY salary DESC
       ) AS department_salary_rank
FROM employees;

이 예제에서는 PARTITION BY 절을 사용하여 department_id별로 데이터를 그룹화하고, 각 부서 내에서 급여 순위를 매깁니다.

DENSE_RANK()와 RANK()의 차이점 ⭐️

  • RANK(): 동일한 순위를 가진 데이터가 있을 경우 그 다음 순위는 건너뜁니다. 예를 들어, 2위가 두 개 있으면 그 다음 순위는 4위가 됩니다.
  • DENSE_RANK(): 동일한 순위를 가진 데이터가 있어도 그 다음 순위는 건너뛰지 않고 연속적인 순위를 부여합니다. 예를 들어, 2위가 두 개 있으면 그 다음 순위는 3위가 됩니다.

예제 차이 비교

SELECT employee_id, employee_name, salary,
       RANK() OVER (ORDER BY salary DESC) AS rank,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

이 쿼리는 RANK()DENSE_RANK()를 나란히 사용하여 두 함수의 결과를 비교할 수 있습니다. 동일한 값을 가진 경우 RANK()는 순위를 건너뛰지만, DENSE_RANK()는 건너뛰지 않고 순위를 매깁니다.

이와 같이 RANK()DENSE_RANK()는 각각의 용도에 따라 사용될 수 있으며, 데이터에 따라 필요한 순위 매김 방식을 선택할 수 있습니다.

profile
누군가에게 도움을 주기 위한 개발자로 성장하고 싶습니다.

0개의 댓글

관련 채용 정보