[ORACLE] 프로그래머스 여러 기준으로 정렬하기
2021. 3. 10.
반응형

programmers.co.kr/learn/courses/30/lessons/59404

 

코딩테스트 연습 - 여러 기준으로 정렬하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

1. 서론

 

order by에 대해 더 알게 된 시간이었다...

 

2. 문제 풀이

 

ANIMAL_INS: 동물 보호소에 들어온 동물의 정보를 담은 테이블

테이블 구조

ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE

(각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부)

 

Q. 동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.

 

난 이 질문 때문에 엄청 고민했다... 내 머릿속에서는

 

if (a.name = b.name)

order by datetime desc

 

이런 상태로 받아들여졌기 때문이다. 그래서 서브 쿼리도 엄청 찾아봤지만 정렬의 순서를 정하는 건 서브 쿼리로는 되는 일도 아니고

이거 하나 하자고 PL/SQL을 쓰란 것도 아니고... 그런데 생각보다 문제는 간단했다.

 

그냥 이름순으로 정렬하는 와중에 이름이 같은 경우에는 나중에 보호소에 들어온 동물 순서로 정렬하면 되는 것이다.

그럼 정렬의 우선순위가 있어야 하나? 해서 또 우선순위에 대해서 찾아봤는데 이 두 조건에 대한 우선순위는 CASE, DECODE 이런 것 필요 없이 그냥 순서가 정해주는 것이었다. 

 

ex) order by a, b

 

이렇게 적으면 이 문제에서 원하는 답을 얻을 수 있다. 즉, a순으로 정렬하다가 a가 같으니까 b 조건을 가져와서 정렬하는 것이다....

 

3. 코드 설명

 

SELECT animal_id, name, datetime
FROM animal_ins 
ORDER BY name, datetime desc;

 

name, datetime 순으로 정렬해주는데 나중에 보호소에 들어온 순으로 정렬해야 하므로 desc을 적어준다.

나중에 들어온 datetime이 더 큰 값이기 때문에 역순으로 정렬해야 하기 때문이다.

 

반응형
myoskin