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()
함수는 데이터 내에서 행의 순위를 계산하는 데 사용됩니다. 이 함수는 동일한 값에 대해 동일한 순위를 부여하며, 그 다음 순위는 건너뜁니다(즉, 동일 순위 다음에 2위가 두 개 있으면 다음 순위는 4위가 됩니다). RANK()
함수는 일반적으로 ORDER BY
와 함께 PARTITION BY
절을 사용하여 특정 기준에 따라 데이터를 그룹화하고 정렬하여 순위를 매깁니다.
SELECT column1, column2, ...,
RANK() OVER (
PARTITION BY column_name1
ORDER BY column_name2
) AS rank_column_name
FROM table_name;
PARTITION BY
: 데이터를 그룹화할 열을 지정합니다. 이 절을 사용하지 않으면 전체 결과 집합에 대해 순위가 매겨집니다.ORDER BY
: 순위를 결정할 기준이 되는 열을 지정합니다. 정렬 기준에 따라 순위가 결정됩니다.아래 예제에서는 직원들의 급여에 따라 전체 데이터를 순위로 매깁니다.
SELECT employee_id, employee_name, salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
이 예제에서는 직원들의 급여를 기준으로 내림차순으로 정렬하고, 그에 따라 순위를 매깁니다.
부서별로 직원의 급여 순위를 매기는 예제입니다.
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
별로 데이터를 그룹화하고, 각 부서 내에서 급여 순위를 매깁니다.
RANK()
함수는 동일한 값이 있을 때 같은 순위를 부여합니다. 예를 들어, 동일한 급여를 받는 두 직원이 있을 경우, 두 직원 모두 같은 순위를 부여받고, 그 다음 순위는 건너뜁니다.
SELECT employee_id, employee_name, salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
RANK()
함수는 동일한 값에 대해 같은 순위를 부여하고 그 다음 순위를 건너뜁니다. 예를 들어, 두 번째 순위가 두 개 있으면 그 다음 순위는 네 번째 순위가 됩니다.DENSE_RANK()
함수를 사용할 수 있습니다.DENSE_RANK()
함수는 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
: 순위를 결정할 기준이 되는 열을 지정합니다. 정렬 기준에 따라 순위가 결정됩니다.아래 예제에서는 직원들의 급여에 따라 전체 데이터를 순위로 매깁니다.
SELECT employee_id, employee_name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
이 예제에서는 직원들의 급여를 기준으로 내림차순으로 정렬하고, DENSE_RANK()
를 사용하여 순위를 매깁니다. 동일한 급여를 받는 직원들이 있더라도 다음 순위는 건너뛰지 않습니다.
부서별로 직원의 급여 순위를 매기는 예제입니다.
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
별로 데이터를 그룹화하고, 각 부서 내에서 급여 순위를 매깁니다.
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()
는 각각의 용도에 따라 사용될 수 있으며, 데이터에 따라 필요한 순위 매김 방식을 선택할 수 있습니다.